2013-09-30 100 views
5

比方說,我做這樣的事情:創建此數組時分配的內存在哪裏? (C)

char* test[] = {"foo","bar","car"}; 

到底是什麼這個相當於假如我做了很長的路?這是否會自動創建我需要釋放的內存?我有點困惑。謝謝。

+2

一個很好的經驗法則是,你只需要釋放a)你創建的內存(例如,使用'malloc'或'mmap'),或者b)由一個函數返回**, *你有責任這樣做。 –

回答

2

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

所以我不能改變這些值,如果它們是隻讀的?我不能說測試[0] =「foo2」? – zProgrammer

+0

字符串文字存儲在只讀位置而不是指針本身。指針在塊中具有本地生存期。 – Sadique

+0

最後一個問題:做「char * x」與「char x [10]」相反的區別是什麼? – zProgrammer

5

您正在聲明指針數組堆。指針指向字符串文字。

變量test遵循正常規則,如果它是一個自動變量(某個函數內的作用域),當它離開函數時,它會超出作用域,因此您不必釋放內存。如果它是靜態分配的(全局變量或static變量),則它與程序一樣長,所以您不必釋放內存。

指針所指向的字符串文字具有靜態存儲,所以您也不會釋放它們。

0

Testcharecter pointers的數組。當爲數組提供值的初始化時,C允許將方括號留空的可能性爲[]。在這種情況下,編譯器將假定該數組的大小與大括號{ }之間包含的值的數目相匹配。不需要釋放。