我在使用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 不同是栈和堆。谁能解释一下吗?
谢谢。
最佳答案
At line 22, src is a address as well, the only thing it diff from des of line 21 is stack and heap.
C 标准没有准确指定字符串文字的分配位置(它不太关心机器的细节),但没有理由假设在静态共享单个全局对象时它将位于堆栈上space(第三个主要分配区域,您已经忘记了)也可以正常工作。
仔细看看你的代码:
char* src = "0123456789";
src
是位于堆栈上的单个指针变量。但是您已经用另一个对象的地址填充了该指针,并且字符串文字可以在任何地方,因为每次调用函数时编译器都会愚蠢地重新分配它。
如果你这样做:
char src[] = "0123456789";
src 上的不同语法表示您希望它是一个数组,而不是指向其他地方的数组的指针。 现在将在堆栈上分配一个字符串,并使用来自文字“0123456789”
的数据填充,但不会与以下对象相同它。您可以毫无问题地写入此版本的 src,因为它实际上每次都会分配并填充一个新数组,因为您已明确要求它这样做。
关于c - 在C中使用strcpy(),堆栈和堆之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34238710/