以下代码在汇编过程中产生分段故障:
(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," ");
}
为什么会发生?
char * sentence = "This is a sentence.";
sentence
是指向字符串文字的指针,"这是句子。" 仅存储在读取内存中,您不应修改它。
以任何方式修改字符串的字符字会导致未定义的行为,在您的情况下,它表现在分段故障中。
好阅读:
char a [] =?字符串有什么区别?和char *p =?string?;?
阅读 strtok
的man
页(错误部分),
- 这些功能修改了他们的第一个参数。
- 这些功能不能在恒定字符串上使用。
和 char *sentence = "This is a sentence";
在仅阅读上下文中分配,因此被视为contant。