Куча против сегмента данных и распределение стека

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

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 будет на куче