Где в памяти строковые литералы? стек / куча?

Возможный дубликат:
Строковые литералы C: где они идут?

Насколько я знаю,

как правило, указатель должен выделяться функцией malloc () и выделяться в куче, а затем не выделяться функцией free ();

и

не указатель (int, char, float и т. д.) будет автоматически размещен в стеке и нераспределен до тех пор, пока функция перейдет к возврату

но из следующего кода:

#include <stdio.h>

int main()
{
char *a;

a = "tesaja";

return 0;
}

куда будет выделено a? стек или куча?


person capede    schedule 11.02.2011    source источник
comment
Возможный дубликат stackoverflow.com/ questions / 2589949 /   -  person Alexander Gessler    schedule 11.02.2011
comment
В вашем примере tesaja называется строковым литералом. Текст постоянный, он же доступен только для чтения и может быть размещен где угодно. Его можно было поместить в исполняемую область и скопировать в записываемую память. Фактическое расположение зависит от настроек компилятора и платформы.   -  person Thomas Matthews    schedule 11.02.2011


Ответы (2)


Строка literal будет размещена в сегмент данных. Указатель на него a будет размещен в стеке.

В конечном итоге ваш код будет преобразован компилятором во что-то вроде этого:

#include <stdio.h>

const static char literal_constant_34562[7] = {'t', 'e', 's', 'a', 'j', 'a', '\0'};

int main()
{
    char *a;

    a = &literal_constant_34562[0];

    return 0;
}

Поэтому точный ответ на ваш вопрос: ни то, ни другое. Стек, данные, bss и куча - все это разные области памяти. Постоянные статические инициализированные переменные будут в данных.

person ulidtko    schedule 11.02.2011
comment
Может быть. Если у двоичных файлов на вашей платформе есть. - person Flexo; 11.02.2011
comment
@capede И не указатель (int, char, float и т. д.) будет автоматически размещен в стеке неверно. Указатель - это переменная, контейнер, и его размер зависит от размера адреса памяти. Его распределение (указатель, а не адрес, на который он указывает) подчиняется тому же правилу, что и другие переменные, в зависимости от того, где они объявлены. - person Breaking not so bad; 11.02.2011
comment
@ ring0: что ты имеешь в виду под where they're declared? внутренняя функция и внешняя функция? - person capede; 11.02.2011
comment
@capede, например, да. Внутри функции блок, как параметр, как глобальная переменная ..., но также как статический, как изменчивый ... В каждом случае компилятор решает, как он должен обрабатывать выделение пространства для переменных. - person Breaking not so bad; 11.02.2011
comment
у вас есть идеи, где я могу получить документацию по variable in space allocation? - person capede; 11.02.2011
comment
Есть еще одна область памяти: исполняемый файл. Здесь хранятся инструкции процессора. Некоторые компиляторы могут помещать данные в исполняемую область, особенно константы. Не существует стандарта, который требовал бы, чтобы строковые литералы помещались в сегмент data. - person Thomas Matthews; 11.02.2011
comment
как называется executable region of memory? это stack? или конкретного названия нет, просто executable region of memory? - person capede; 16.05.2011
comment
@capede, вам действительно нужно написать программу на ассемблере. Таким образом вы очень хорошо поймете сегментацию памяти. - person ulidtko; 17.05.2011
comment
Я войду в мир ассемблера вскоре после того, как стану монахом на C: D - person capede; 17.05.2011

Сам a (указатель) определяется как локальная переменная (неявно) с использованием класса хранилища auto, поэтому он выделяется в стеке (или в любой другой памяти, которую реализация использует для выделения в стеке - некоторые машины, такие как мэйнфреймы IBM и во-первых, Крейс, не имейте «стека» в обычном понимании).

Строковый литерал «tesaja» размещается статически. Где именно это будет, зависит от реализации - некоторые помещают это вместе с другими данными, а некоторые помещают в сегмент данных только для чтения. Некоторые рассматривают все данные как чтение / запись, а весь код - как только чтение. Поскольку они хотят, чтобы строковый литерал был доступен только для чтения, они помещают его в сегмент кода.

person Jerry Coffin    schedule 11.02.2011