2013-07-10 11 views
8

Załóżmy następujący kod:c kodowanym, wskaźnik i alokacji pamięci dla pól

struct c { 
    char* name; 
}; 

int main(int argc, char *argv[]) { 
    struct c c1; 
    c1.name = "Ana"; 
    printf ("%s\n",c1.name); 
    return 0; 
} 

Moją pierwszą reakcją byłoby myśleć, że muszę przeznaczyć trochę miejsca, albo na stercie lub poprzez wyraźne char name[] = "Anna" , ale mój przykład powyżej działa. Czy kompilator właśnie zapisuje ten ciąg w segmencie danych i wskazuje na niego? Innymi słowy, jest to, że robi się to tak, jakby wykonać

Odpowiedz

8
struct c c1; 
c1.name = "Ana"; 

Nie trzeba przydzielić pamięci tutaj, bo robisz punkt wskaźnik c1.name na ciąg dosłownych i ciąg literały mają statyczny czas przechowywania. To nie jest podobny do:

char name[] = "Anna"; 

ponieważ w tym przypadku pamięci jest przeznaczona do przechowywania żądło dosłowny, a następnie ciąg dosłowne "Anna" jest kopiowane do tablicy name. Co zrobić z cesją struct c1.name = "Ana" jest podobny do tego, kiedy zrobić:

char *name = "Anna"; 

to zrobić punkt wskaźnik do łańcucha dosłowne.

+1

+1 za rzeczywiste udzielenie odpowiedzi na pytanie –

+2

Dobra, myślę, że rozumiem. Wyjaśniło to, że jest to "czas przechowywania statycznego", co oznacza, że ​​faktycznie znajduje się w segmencie danych podczas kompilacji, a następnie kompilator wie, gdzie dokładnie wskazać. Dzięki. –

3

Jestem nowy na C, ale z tego, co myślę, że to może być tak samo jak

char *cThing; 
cThing = "Things!"; 

gdzie printf("%s\n", cThing); by następnie wydrukować „rzeczy”, z wyjątkiem jesteś deklarowania wskaźnik w struct.

+1

Daję ci punkt zwycięstwa :) Wydaje mi się niesamowite, że miałeś intuicję i użyłeś dobrego prostego przykładu, żeby ją przekazać. Dobra robota :) –

Powiązane problemy