2012-12-20 49 views
1

下面的代碼段在編譯期間產生分段故障:字符數組初始化的產生分段故障

(GDB)運行
啓動程序:/home/anna/Desktop/a.out
接收 程序信號SIGSEGV,分段故障。
0xb7e97845中的strtok()從/lib/i386-linux-gnu/libc.so.6

#include <string.h> 
#include <stdio.h> 

main() { 
char * sentence = "This is a sentence."; 
char * words[200] ; 
words[0] = strtok(sentence," "); 
} 

改變第五行之後,不會引發錯誤。

#include <string.h> 
#include <stdio.h> 

main() { 
char sentence[] = "This is a sentence."; 
char * words[200] ; 
words[0] = strtok(sentence," "); 
} 

這是怎麼發生的?

+1

注意:您正在執行程序,編譯已經成功創建了'a.out'文件。它在編譯過程中不會出現段錯誤。 – unwind

+1

@WhozCraig這不是這個問題的重複 - 鏈接問題中的代碼實際上並沒有寫入字符串文本,儘管標題。 – interjay

+0

@interjay好點。這個問題每天至少要問幾次。你會認爲這很容易找到。我會繼續搜索。謝謝。 – WhozCraig

回答

2

閱讀man頁面strtok(BUGS部分),

  • 這些功能修改他們的第一個參數。
  • 這些函數不能用於常量字符串。

char *sentence = "This is a sentence";被分配在只讀上下文中,因此被視爲contant。

6
char * sentence = "This is a sentence."; 

sentence是指向一個字符串指針「這是一個句子。」存儲在只讀存儲器中,您不應該修改它。
以任何方式修改字符串文字都會導致未定義的行爲並且在您的情況下它會顯示爲分段錯誤。

良好閱讀:
What is the difference between char a[] = ?string?; and char *p = ?string?;?

+1

而downvote是爲了?如果有技術推理,麻煩告訴。 –