2015-04-02 109 views
-1
#include <stdio.h> 
int a; 
int *b; 
int **c; 
int ***d; 
int ****e; 
// * is the "value of operator" 
// * is also called the dereferencing // operator 

int main(void) { 
    a = 25; 
    b = &a; // & is the "address of operator" c = &b; 
    d = &c; 
    e = &d; 

    printf("\n\n%d %d %d\n\n",*(&a),*b+**c, ***d*****e); 

    return 0; 
} 

當我運行它說分段錯誤:11我該如何解決它,它是什麼意思?C編程分段錯誤:11

+0

您已將'c =&b;'作爲註釋錯誤。 – Himanshu 2015-04-02 10:26:00

+0

@Himanshu不,這是OP案例中的__actual__錯誤。 – 2015-04-02 10:27:34

+0

http://ideone.com/tmLN3x – Gopi 2015-04-02 10:28:15

回答

0

你錯過了

c = &b; 

如果沒有這一點,你有c未初始化的並且使用的是它導致不確定的行爲

1

我想,在你的代碼

c = &b; 

部分被註釋掉因爲失誤。因此,c的值是NULL(全局範圍),並且在printf()參數中被取消引用和使用,該參數可以反過來調用undefined behaviour

Segmentation fault是未定義行爲的副作用之一。基本上它表示一些內存訪問衝突

FYI,C11標準文檔,章6.5.3.3

一元*操作者表示間接。如果操作數指向一個函數,那麼結果是一個函數指示符 ;如果它指向一個對象,則結果是一個指定 對象的左值。如果操作數的類型爲‘‘pointer to type’’,則結果的類型爲‘‘type’’。如果 無效值已分配給指針,則一元運算符*的行爲未定義爲 。

和在同一章

在用於由一元運算符*解引用一個指針的無效值reagarding 無效值,從腳註102是一個空指針,[... ...]

解決方案:取消註釋部分。

0

您在評論中缺少該行。

c=&b; 

這就是您得到分段錯誤的原因。

爲了更好地理解,你可以這樣做。

printf("\n\n%d %d %d\n\n",*(&a),*b +**c, (***d)*(****e)); 
0

c的值未初始化,我們試圖將該變量的引用用於d,所以pl。在d = & c之前添加c = & b,這應該能夠解決您的問題