字符数组初始化产生分段错误

时间:2012-12-20 11:37:50

标签: c arrays segmentation-fault

以下代码在编译期间产生分段错误:

(gdb)运行
启动程序:/home/anna/Desktop/a.out
程序接收信号SIGSEGV,分段故障。
来自/lib/i386-linux-gnu/libc.so.6的strtok()中的0xb7e97845

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

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

更改第5行后,不会抛出任何错误。

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

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

为什么会这样?

2 个答案:

答案 0 :(得分:6)

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

sentence是一个指向字符串文字的指针“这是一个句子。”存储在一个只读存储器中,你不应该修改它。
以任何方式修改字符串文字会导致未定义的行为,在您的情况下,它会出现分段错误。

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

答案 1 :(得分:2)

阅读man的{​​{1}}页面(BUGS部分),

  • 这些函数修改了他们的第一个参数。
  • 这些函数不能用于常量字符串。

strtok在只读上下文中分配,因此被视为包含。