在简单的C代码中进行分段错误(核心转储)

我是C的新人。我指的是Brian W Kernighian和Dennis Ritchie所着的“C编程语言”一书。 本书中给出了一个指针增量和赋值的代码,如下所示。

#include int main() { char *s = "Goal"; char *t = "Home"; while(*s++ = *t++) printf(*s); return 0; } 

使用该命令保存和编译代码

 gcc ptr.c -o ptr -std=c99 

现在通过运行命令运行代码

 ./ptr 

我收到以下错误

分段故障(核心转储)

错误似乎在while循环条件中。 但是代码与本书中给出的完全相同。 我错过了什么?

st都是字符串文字,你不能修改字符串文字。 但是这段代码

 *s++ = *t++ 

将修改s ,这会导致分段错误。

要修复它,请使用char数组。 我还修改了printf部分以使其合法。

 #include int main() { char arr[] = "Goal"; char *s = arr; char *t = "Home"; while(*s++ = *t++) ; printf("%s\n", arr); return 0; } 

但是,我认为这个程序最好使用单独的函数来复制字符串,程序看起来会更清晰。

 #include void my_strcpy(char *s, char *t); int main() { char s[] = "Goal"; char *t = "Home"; my_strcpy(s, t); printf("%s\n", s); return 0; } void my_strcpy(char *s, char *t) { while(*s++ = *t++) ; } 

问题是printf期望第一个参数是char * ,即指向字符或字符地址的东西。 当你说printf(*s)你传给它一个实际的字符,即一个从0到255或-128到127的数字,程序将把这个数字当作一个地址,这不会是您系统上的有效地址。

当我们说* s =“hello”时,s指向文本段中存在的地址(“hello”进入文本段)。 因此,显然更改文本段的值会导致SEGV终止。

对于s [] =“hello”如果我们执行* s ++,我们正在递增(修改)基址,因此我们得到“左值作为递增操作数”错误。