c - 在C中使用strcpy(),堆栈和堆之间的区别?

标签 c string heap-memory stack-memory

我在使用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/

相关文章:

c++ - 使用 wcstombs_s 将 std::wstring 转换为 char*

string - 如何使用 JSP 和 JSTL 替换换行符?

C++ 类成员 : Stack vs. 堆分配

java - 对象不断提升到 Old Gen

c++ - 如何将对象放置在堆以外的其他地方?

c++ - 你如何在类和命名空间内的 linux 中克隆()?

python - 在 Python 中删除小数点后的尾随零

c - c函数在有效行为后返回零是标准的吗?

c - SSL_CONNECT 因 SSL_ERROR_SYSCALL 错误而失败

c - 使用 C 中的 Expat 库解析 XML 文件