2011-07-03 66 views
2
int main() { 


    char **k; 
    char *s ="abc"; 
    char *b ="def"; 

    *k = s; 


} 

//爲什麼會產生分段錯誤?不是所有的東西都不會在沒有任何問題的情況下存儲次要內存分配問題C++

+1

你認爲'* k'應該是什麼? 'k'指向什麼? – Cascabel

回答

4

k尚未定義值,因此解除引用(*k)會導致未定義的行爲。如果添加初始化,即k = &b;,*k = s;將在事後工作。

+1

所以char * s自動定義了值?什麼是使用k的正確方法? – Mark

+2

@Mark:你可以說'k =&s'。 –

+0

不,但你初始化's'和'k'使它們有一個有效值。請記住,取消引用指針意味着*讀取指針的值,將其視爲內存地址並訪問此內存地址*。如果'k'沒有初始值,'* k'基本上讀取'k'中任意位模式指向的任何位置。 –

1

Alexander is correct,您正在取消k*k = s;char *s="abc";的初始化可能看起來是一樣的,但它的語法糖時間更長:char *s; s="abc";

2

好的,我希望我不會被任何輕微的錯誤毆打......這是我試圖解釋爲盡我所能。

用普通的char *它會指向一個char。

用char **它指向一個指向char的指針。 * k值在堆上而不是堆棧上。

即是這樣的:

stack (1) heap (2) heap or ... (3) 
+-----+ +-----+  +----+ 
|char*| -> |char*| -> |char| 
+-----+ +-----+  +----+ 

現在字符*的是不是真的字符串但是它們被視爲是由一個空值或零字節結束在存儲器的連續的可打印字符的塊。所以字符串將被存儲並在(3)

中被引用所以要修復你的代碼,你需要爲char *(不是char)分配空間。

即把

k = (char**)malloc(sizeof(char*)); 

前行

*k = s; 

不,這是一個很好的代碼,但它不應該崩潰。

+0

哎呀,讓我糾正一下。 – Matt

+0

哦,是的,現在很清楚:)謝謝! – sarnold