Gdzie w pamięci są literały ciągów? stos / sterta? [duplikat]

to pytanie ma już odpowiedzi tutaj : Zamknięte 10 lat temu .

Możliwy duplikat:
literały ciągów C: dokąd idą?

Z tego co wiem,

Ogólnie rzecz biorąc, wskaźnik musi być przydzielone przez malloc () i zostanie przydzielone to heap, then unallocated by free ();

I

Non pointer (int,char,float,itd..) będzie przydzielane automatycznie do stosu, oraz nieprzydzielone tak długo, jak długo Funkcja Przechodzi do return

Ale z następującego kodu:

#include <stdio.h>

int main()
{
char *a;

a = "tesaja";

return 0;
}

Gdzie a zostanie przydzielona ? stos czy sterta ?

Author: Rndp13, 2011-02-11

2 answers

Ciąg znaków literal zostanie przydzielony w segmencie danych . Wskaźnik do niego, a, zostanie przydzielony na stosie.

Twój kod zostanie ostatecznie przekształcony przez kompilator w coś takiego:

#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;
}

Dlatego dokładna odpowiedź na twoje pytanie brzmi: ani . stos, dane, bss i heap są różnymi regionami pamięci. Statyczne zmienne inicjalizowane Const będą w dane .

 17
Author: ulidtko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-13 13:34:16

a sama (wskaźnik) jest zdefiniowana jako zmienna lokalna (w domyśle) przy użyciu klasy pamięci masowej auto, więc jest przydzielana na stosie (lub dowolnej pamięci, której implementacja używa do alokacji stosu-niektóre maszyny, takie jak mainframe IBM i pierwsze Crays, nie mają "stosu" w normalnym znaczeniu).

Ciąg znaków" tesaja " jest przydzielany statycznie. Dokładnie to, gdzie to będzie zależy od implementacji-niektórzy umieszczają go z innymi danymi, a inni umieszczają w trybie tylko do odczytu segment danych. Kilka traktuje wszystkie dane jako Odczyt/Zapis, a cały kod jako Tylko do odczytu. Ponieważ chcą, aby ciąg znaków był tylko do odczytu, umieszczają go w segmencie kodu.

 10
Author: Jerry Coffin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-11 15:35:00