在简单的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
循环条件中。 但是代码与本书中给出的完全相同。 我错过了什么?
s
和t
都是字符串文字,你不能修改字符串文字。 但是这段代码
*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 ++,我们正在递增(修改)基址,因此我们得到“左值作为递增操作数”错误。