【发布时间】:2019-05-16 22:12:55
【问题描述】:
据我了解,字符串文字存储在只读内存中,在运行时对其进行修改会导致分段错误,但我下面的代码编译时没有分段错误。
#include <string.h>
#include <stdio.h>
int main() {
char* scr = "hello";
strcpy(scr,scr);
printf("%s\n",scr);
return 0;
}
输出:你好
同样的事情,如果我尝试将源字符串复制到不同的目标字符串文字,则会引发分段错误
#include <string.h>
#include <stdio.h>
int main() {
char* scr = "hello";
char* dst = "hello";
strcpy(dst,scr);
printf("%s\n",dst);
return 0;
}
输出:分段错误(核心转储)
根据 K&R 的书 strcpy() 实现类似于下面
void strcpy(char *s, char *t)
{
while ((*s = *t) != '\0') {
s++;
t++;
}
}
如果是这样,我应该在这两种情况下都遇到分段错误。
编译器详情:
gcc 版本 7.3.0 (Ubuntu 7.3.0-27ubuntu1~18.04)
【问题讨论】:
-
欢迎来到未定义行为的奇妙世界,它不必表现在段错误中。
-
strcpy 完全有可能检查您是否正在将字符串复制到自身并且什么都不做,这并没有使它变得更少未定义。
标签: c string segmentation-fault strcpy string-literals