Куча против сегмента данных и распределение стека
Посмотрим на следующую программу и не уверены, как распределена память и почему:
void function() {
char text1[] = "SomeText";
char* text2 = "Some Text";
char *text = (char*) malloc(strlen("Some Text") + 1 );
}
В приведенном выше коде последний, очевидно, находится в куче. Однако, поскольку я понимаю, что text2 находится в сегменте данных программы, а text1 может находиться в стеке. Или мое предположение неверно? Какое здесь право? Является ли этот компилятор зависимым?
Спасибо
Ответы
Ответ 1
// 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 );
Ответ 2
Да, вы правы, в большинстве систем:
text1
будет записываемым массивом переменных в стеке (он должен быть записываемым массивом)
text2
должен быть const char*
на самом деле, и да, он будет указывать на текстовый сегмент исполняемого файла (но это может измениться в исполняемых форматах)
text
будет на куче