【发布时间】:2016-03-18 06:17:09
【问题描述】:
我在使用libc的strcpy()时遇到了一个问题,代码如下:
16 int main(int argc, char *argv[])
17 {
18 char* src = "0123456789";
19 char* des = (char*) malloc(strlen(src) + 1);
20
21 des = strcpy(des, src);
22 des = strcpy(src, "1010101");
23
24 printf("%s\n", des);
25 return 0;
26 }
我想检查 strcpy 在其目标字符串在堆栈或堆中时是否正常工作,因此您将看到第 21 行和第 22 行。
事实证明,第 21 行运行良好,但是程序在执行到第 22 行时会抛出 SEGMENTATION FAULT。而且,我已经调试到 libc,发现它在这一行崩溃了:
91 while ((*dest++ = *src++) != '\0')
不是很清楚看它在哪一点崩溃,所以我把这一条语句分成了几条,让它们和第91行有相同的功能。我这里省略那段代码,最后它崩溃了在分配 *dest。
所以在这里我无法理解它为什么会崩溃。在第 22 行,src 也是一个地址,唯一不同于第 21 行的 des是栈和堆。谁能解释一下?
谢谢。
【问题讨论】:
-
您尝试写入字符串文字。它们既不是栈也不是堆,它们是不可写的。
-
src is a address as well, the only thing it diff from des of line 21 is stack and heap不,这不是真的。 -
编译器供应商何时会停止这种做法?
char *src = "123456";将 const char 数组地址分配给非 const 指针。我们已经有 20 多年的时间来修复旧程序,最坏的情况是编译器选项可能会覆盖默认值并允许这种草率。 -
发布带有行号的代码不受欢迎,它妨碍了轻松剪切和粘贴到源文件中进行测试。请避免。
标签: c string heap-memory stack-memory