2011-04-30 203 views
0

可能重複:
why segmentation fault in this program這種情況下爲什麼會出現分段錯誤?

int main() 
{ 
     char *a="asdasd"; 
     int i; 

     for(i=0;i<6;i++) 
     { 
       (*a)++; 
       printf("\n%s",a); 

     } 
} 

輸出分割故障

int main() 
{ 
     char a[]="asdasd"; 
     int i; 

     for(i=0;i<6;i++) 
     { 
       (*a)++; 
       printf("\n%s",a); 

     } 
} 

沒有分段故障

+1

第一個程序中的分段錯誤,因爲你很幸運。在第二個程序中沒有分段錯誤,因爲你不走運。調用'printf()'(或任何接受可變數量參數的函數)時,如果沒有範圍原型調用未定義行爲。未定義行爲的一個表現是分段錯誤(一種很好的表現形式);另一個是一切正如你期望的那樣工作(一個不好的表現)......哦,你也試圖在第一個程序中更改一個不可修改的數組:另一個未定義行爲的案例 – pmg 2011-04-30 23:18:22

+0

@pmg你能否提供一些關於表現的鏈接未定義的行爲? – bacchus 2011-04-30 23:22:43

+0

@bacchus:http://c2.com/cgi/wiki?UndefinedBehavior – pmg 2011-04-30 23:32:02

回答

1

在第一個,你聲明瞭一個指向char的指針,並將一個指針的值賦給一個常量爲char的in。在第二個中,你聲明瞭一個char的數組,並給它一個初始值,但它結束直到不是一個常數。在循環中,您嘗試增加指針位置或數組第一個索引處的值。由於指針指向一個常量char,它會失敗:您無法更改常量。但是,數組可以被修改,因此不會失敗。

+0

根據你的回答,在C字符串文字中(類型爲char [])衰減爲char *,而不是const char *。我認爲向指針添加'const'是一個好主意('const char * a =「foo」;'),但這與問題無關 – pmg 2011-04-30 23:21:15

+0

但是不是icktoofay的觀點,即字符串文字是'常量' (即不可修改) - 這不是關於'const'關鍵字。 – 2011-04-30 23:23:15

+0

@pmg:我很抱歉,我試圖說數組是可以修改的,但是定義爲char *的那個被賦值爲const char *的值不是。也許我並沒有像以前那麼清楚。 – icktoofay 2011-04-30 23:23:18

0

架構你使用工具char *a="asdasd";通過存儲常量字符串"asdasd"在被標記爲只讀,因爲它真的const char*即使你說,否則頁面。這是一件好事,因爲它使您的操作系統更容易在多個進程之間共享這些頁面(就像它可以對代碼執行操作一樣)。

如果你正在使用gcc,你可以使用-Wwrite-strings可以讓編譯器警告你,當你這樣做,或者如果您使用的是older version(預4.0),-fwritable-strings(或-traditional)不使用讀 - 只有頁面映射。

+0

嗯..在C字符串文字是'char []',而不是'const char []'或'const char *'。使用'gcc -Wwrite-strings'使得gcc成爲類似於C語言的編譯器實現,但不完全是C. – pmg 2011-04-30 23:36:26

+0

@pmg字符串文字具有形式類型'char []'而不是語義類型'const char []'。 C++用他們最後一次迭代改變了它,C編譯器必然會遵循。 – geocar 2011-04-30 23:46:53

相關問題