Расположение переменных в памяти, C - PullRequest
0 голосов
/ 25 сентября 2011

Я смотрю экзамены по Си из прошлых лет, и мне попался вопрос, который я не до конца понял.Они предоставили простой кусок кода и спросили о расположении различных переменных в памяти.Варианты были heap stack и unknows.Я знаю, что автоматические переменные инициализируются в стеке, и что динамически размещенные переменные находятся в куче.

Итак, первый вопрос - что неизвестно?

Для второго вопроса вот код и таблица с правильным ответом:

#include <string.h>
#include <stdlib.h>

typedef struct
{
    char *_str;
    int _l;
} MyString;

MyString* NewMyString (char *str)
{
    MyString *t = (MyString *) malloc (sizeof (MyString)); //LINE 12
    t->_l = strlen (str);
    t->_str = (char*) malloc (t->_l + 1);
    strcpy (t->_str, str);
    return t;
}

int main()
{
    MyString ** arr = (MyString**) malloc (sizeof (MyString*)*10); //LINE 21
    int i;
    for (i=0;i<10;i++)
    {
        arr[i] = NewMyString ("item"); //LINE 25
    }
    // do something
    // free allocated memory
    return 0;
}

А вот таблица срезультаты, которые я не понял

Variable     Line number     Memory location
arr              21              stack
*arr             21              heap
**arr            21              unknows
arr[5]           25              heap
arr[3]->_str[2]  25              heap
*(t->_str)       12              unknows

Мне кажется, я понимаю arr и *arr, но почему **arr неизвестно?На остальное я не мог ответить вообще, поэтому любая помощь была бы отличной.Я знаю это долго, так что спасибо заранее ...

Ответы [ 2 ]

7 голосов
/ 25 сентября 2011

Это дерьмовый экзаменационный вопрос.Стандарт C не определяет , как выделяется хранилище - он только указывает семантику .Куча, стек и т. Д. - это особенности конкретной реализации.Прочитайте о классе хранения и продолжительности хранения в C.

Переменная arr размещена в стеке («автоматическая переменная»), но значения выражений *arr и **arr получены следующим образомуказатели, и вообще, невозможно сказать, где расположена память, просто указав на нее указатель.Аналогичные рассуждения относятся к другому неизвестному случаю.

0 голосов
/ 25 сентября 2011

О неизвестном: идея вопроса заключается в том, что в строке 21 *arr выделено, но не инициализировано. Поэтому он указывает на какое-то произвольное местоположение. Поэтому размещение **arr считается неизвестным.

Конечно, замечание zvrba о семантике все еще действует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...