比方說,我做這樣的事情:創建此數組時分配的內存在哪裏? (C)
char* test[] = {"foo","bar","car"};
到底是什麼這個相當於假如我做了很長的路?這是否會自動創建我需要釋放的內存?我有點困惑。謝謝。
比方說,我做這樣的事情:創建此數組時分配的內存在哪裏? (C)
char* test[] = {"foo","bar","car"};
到底是什麼這個相當於假如我做了很長的路?這是否會自動創建我需要釋放的內存?我有點困惑。謝謝。
test
是指向堆棧中字符的指針數組,字符串文字"foo"
,"bar"
,"car"
存儲在只讀位置。你不需要任何東西。
test[0]
,test[1]
,test[2]
指向只讀數據。請閱讀C中的作用域規則和變量的生存期。默認情況下,塊中沒有存儲類說明符的變量具有auto
存儲類說明符,這意味着具有本地生存期的變量。
{
char* test[] = {"foo","bar","car"};
}
//cannot access test here
test [0] = "new"; // Compile time error - ‘test’ undeclared
雖然試圖修改 「酒吧」 到 「焦油」 將給運行時錯誤:
char* test[] = {"foo","bar","car"};
test[1][0] = "tar"; // Run-time error
然而,這是好的test[0]
開始從"foo"
指向"new"
:
test [0] ="new";
對"foo"
的引用丟失。
所以我不能改變這些值,如果它們是隻讀的?我不能說測試[0] =「foo2」? – zProgrammer
字符串文字存儲在只讀位置而不是指針本身。指針在塊中具有本地生存期。 – Sadique
最後一個問題:做「char * x」與「char x [10]」相反的區別是什麼? – zProgrammer
'malloc'在堆上分配內存;說「malloc」會把它推到堆棧上是不正確的或者至少是誤導性的。「 – icktoofay
您正在聲明指針數組堆。指針指向字符串文字。
變量test
遵循正常規則,如果它是一個自動變量(某個函數內的作用域),當它離開函數時,它會超出作用域,因此您不必釋放內存。如果它是靜態分配的(全局變量或static
變量),則它與程序一樣長,所以您不必釋放內存。
指針所指向的字符串文字具有靜態存儲,所以您也不會釋放它們。
Test
是charecter pointers
的數組。當爲數組提供值的初始化時,C允許將方括號留空的可能性爲[]。在這種情況下,編譯器將假定該數組的大小與大括號{ }
之間包含的值的數目相匹配。不需要釋放。
一個很好的經驗法則是,你只需要釋放a)你創建的內存(例如,使用'malloc'或'mmap'),或者b)由一個函數返回**, *你有責任這樣做。 –