куча против сегмента данных против выделения стека - PullRequest
15 голосов
/ 01 июня 2011

Смотрю на следующую программу и не знаю, как выделяется память и почему:

void function() {
    char text1[] = "SomeText";
    char* text2 = "Some Text";
    char *text = (char*) malloc(strlen("Some Text") + 1 );
}

В приведенном выше коде последний явно находится в куче.Однако, как я понимаю, text2 находится в сегменте данных программы, а text1 может быть в стеке.Или мое предположение неверно?Какое правильное предположение здесь?Зависит ли этот компилятор?

Спасибо

Ответы [ 2 ]

16 голосов
/ 01 июня 2011
// Array allocated on the stack and initialized with "SomeText" string.
// It has automatic storage duration. You shouldn't care about freeing memory.
char text1[] = "SomeText"; 

// Pointer to the constant string "Some Text".
// It has static storage duration. You shouldn't care about freeing memory.
// Note that it should be "a pointer to const".
// In this case you'll be protected from accidential changing of 
// the constant data (changing constant object leads to UB).
const char* text2 = "Some Text";

// malloc will allocate memory on the heap. 
// It has dynamic storage duration. 
// You should call "free" in the end to avoid memory leak.
char *text = (char*) malloc(strlen("Some Text") + 1 );
5 голосов
/ 01 июня 2011

Да, вы правы, на большинстве систем:

text1 будет массивом переменных для записи в стеке (требуется, чтобы он был записываемым массивом)

text2 должно быть const char* на самом деле, и да, оно будет указывать на текстовый сегмент исполняемого файла (но это может измениться в зависимости от исполняемых форматов)

text будет в куче

...