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

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

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

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

и

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

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

#include <stdio.h>

int main()
{
char *a;

a = "tesaja";

return 0;
}

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

Ответ 1

Строка 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 и куча - это разные области памяти. Константные инициализированные переменные const будут в данных.

Ответ 2

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

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