首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >堆栈内存中的Memcpy

堆栈内存中的Memcpy
EN

Stack Overflow用户
提问于 2012-03-29 10:19:59
回答 7查看 5K关注 0票数 1

可能重复:

What is the difference between char a[] = “string” and char *p = “string”?

在堆栈内存上使用memcpy与在堆内存上使用memcpy有什么区别?以下代码在Tru64上工作,但在LINUX上运行分段错误

代码语言:javascript
复制
char * string2 = "            ";
(void)memcpy((char *)(string2),(char *)("ALT=---,--"),(size_t)(10));

第二个版本在LINUX上工作。

代码语言:javascript
复制
char * string2 = malloc(sizeof(char)*12);
(void)memcpy((char *)(string2),(char *)("ALT=---,--"),(size_t)(10));

有人能解释一下LINUX上的分段错误吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-03-29 10:21:10

第一个示例有一个未定义的行为。因此,它可能正确或不工作,或显示任何随机行为。

解释:

第一个示例声明指向字符串文本的指针string2。字符串文本存储在实现定义的只读内存位置中。用户程序不允许修改此内存。任何这样做的尝试都会导致未定义的行为

参考资料:

C99标准6.4.5/5“字符串文字-语义”:

在翻译阶段7,值为零的字节或代码被附加到由字符串字面或文字产生的每个多字节字符序列中。然后使用多字节字符序列初始化一个静态存储时间和长度的数组,该数组仅足以包含该序列。对于字符串文本,数组元素具有char类型,并由多字节字符序列的单个字节初始化;对于宽字符串文本,数组元素具有wchar_t类型,并以宽字符序列初始化.

如果这些数组的元素具有适当的值,则未指定这些数组是否不同。如果程序试图修改这样的数组,则行为是未定义的.

票数 7
EN

Stack Overflow用户

发布于 2012-03-29 10:23:34

在第一个示例中,指针和实际字符串内容之间必须有所不同:虽然指针(string2)位于堆栈上,但实际的字符串字节不是。它们在常量区有很好的变化,是只读的,因此出现了分段故障。

票数 2
EN

Stack Overflow用户

发布于 2012-03-29 10:26:10

首先,行为是没有定义的。来自C99,6.4.5/6:

未指定这些数组是否不同,只要它们的元素具有适当的值。如果程序试图修改这样的数组,则行为是未定义的。

实际上,操作系统选择了在只读内存中加载相关的图像部分;因此,当您尝试编写时会出现分段错误。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9923436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档