Gwarantuję, że pytanie to zostało zadane wcześniej, ale nie udało mi się go znaleźć za pomocą wyszukiwarki; przepraszam z góry za wszelkie zwolnienia.C Tworzenie aranżacji - stos lub rozmieszczenie sterty?
To moje (potencjalnie błędne) zrozumienie, które można przydzielić tylko do stosu, gdy znany jest rozmiar obiektu podczas kompilacji. Tak więc w przypadku inicjalizacji tablicy, można wykonać jedną z nich (i to powinno iść na stosie):
char charArray[50];
Ponieważ rozmiar tej tablicy jest znany w czasie kompilacji, to nie powinien mieć problemów.
Z drugiej strony, to (wierzę) to także ważny kod:
char anotherCharArray[someVariable + 50];
byłoby to na stosie, jak również? Jestem prawie pewny, że kod ulega uszkodzeniu, jeśli zwolnisz() to, więc to sprawia, że myślę, że tak, ale to naprawdę nie ma dla mnie sensu. Podobnie jest w 100% wyłącznej sytuacji, w której trzeba użyć free(), gdy dane zostały przydzielone za pośrednictwem malloc?
Z góry dziękuję za pomoc.
@Shookit: musisz określić, czy mówisz o zmiennych lokalnych lub globalnych. –
@PaulR, jeśli tablica ma zmienną długość, nie może znajdować się w zasięgu globalnym. –
Musisz odróżnić * automatyczną pamięć masową * i * stos *, która jest niskopoziomowym sposobem przechowywania danych. Dane umieszczone w pamięci automatycznej można umieszczać również w innych miejscach, np. W rejestrach. W przypadku lokalnej tablicy o nieznanym rozmiarze (znanej jako VLA: s), kompilator może umieścić ją na stosie, można także przydzielić pamięć na stercie (tak długo, aż zwolni ją w odpowiednich miejscach). W rzeczywistości, VLA: s nie idą dobrze razem z 'setjmp' /' longjmp', ponieważ mogą przeciekać (i są dopuszczone do tego przez standard C). – Lindydancer