2012-11-15 64 views
2

我讀噸TUTOS和片斷的,但我還是不明白爲什麼我得到這個段錯誤:問題以C雙指針分配

int fun(char **p) { 

    int i; 

    *p = malloc(2); 
    *p[0]=10; 
    *p[1]=20; // segfault NULL pointer 

    printf("fun()/n"); 
    for (i=0; i<2; i++) 
    printf("%d ",*p[i]); 
} 

int main(int argc, const char *argv[]) 
{ 
    char* buffer; 
    int i; 

    fun(&buffer); 

    printf("main()\n"); 

    for (i=0; i<2; i++) 
    printf("%d ",buffer[i]); 

    return 0; 
} 

在gdb中,它提供了:

Program received signal EXC_BAD_ACCESS, Could not access memory. 
Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000000 
0x0000000100000dea in fun (p=0x7fff5fbffab0) at test.c:10 
10 *p[1]=20; 
(gdb) p *p[0] 
$1 = 10 '\n' 
(gdb) p *p[1] 
Cannot access memory at address 0x0 
(gdb) 

我已經看到很多類似的片段,但肯定有一些我深有誤解。

+3

當有人從「tutos and snippets噸」中學習時,我感到奇怪的警惕...... –

+1

你應該檢查你的'malloc'調用錯誤。 – squiguy

+0

@KerrekSB:非常有趣。你是誰,你碰巧知道嗎? – phocean

回答

4

您的意思是(*p)[1]。你所說的是*(p[1])

+0

就是這樣。但看到你的其他評論感到難過。你不知道,我不尊重我。從C開始的犯罪在哪裏,不理解某些事物並提出問題?我花了幾天的時間討論一個糟糕的語法問題。所以呢?不管怎麼說,還是要謝謝你。 – phocean

+0

@phocean:嘿,沒有冒犯,祝你好運!花一些時間如果你喜歡,我相信這將是一個有益的經驗。你會很快回答問題。 –

0

嘗試在LHS處返回變量的相同數據類型的地址。 malloc()默認返回一個空值。 p =(char)malloc(2); 這種方式編譯器知道它有多少個字節來移動指針來獲取新的變量。

+1

這個問題很久以前就被回答和接受了。爲何添加另一個? –

+0

這個答案在需要修復之前可能會很糟糕,並且無益。函數'malloc()'不返回'void',並且將'malloc()'的結果轉換爲'char'是非常糟糕的。你可能意思是'void *'和'char *',然後它仍然是一個壞主意:http://stackoverflow.com/a/605858/139746。即便如此,這並沒有回答這個問題。 –