可能重复:
What is the difference between char a[] = “string” and char *p = “string”?
在堆栈内存上使用memcpy与在堆内存上使用memcpy有什么区别?以下代码在Tru64上工作,但在LINUX上运行分段错误
char * string2 = " ";
(void)memcpy((char *)(string2),(char *)("ALT=---,--"),(size_t)(10));第二个版本在LINUX上工作。
char * string2 = malloc(sizeof(char)*12);
(void)memcpy((char *)(string2),(char *)("ALT=---,--"),(size_t)(10));有人能解释一下LINUX上的分段错误吗?
发布于 2012-03-29 10:21:10
第一个示例有一个未定义的行为。因此,它可能正确或不工作,或显示任何随机行为。
解释:
第一个示例声明指向字符串文本的指针string2。字符串文本存储在实现定义的只读内存位置中。用户程序不允许修改此内存。任何这样做的尝试都会导致未定义的行为。
参考资料:
C99标准6.4.5/5“字符串文字-语义”:
在翻译阶段7,值为零的字节或代码被附加到由字符串字面或文字产生的每个多字节字符序列中。然后使用多字节字符序列初始化一个静态存储时间和长度的数组,该数组仅足以包含该序列。对于字符串文本,数组元素具有char类型,并由多字节字符序列的单个字节初始化;对于宽字符串文本,数组元素具有wchar_t类型,并以宽字符序列初始化.
如果这些数组的元素具有适当的值,则未指定这些数组是否不同。如果程序试图修改这样的数组,则行为是未定义的.
发布于 2012-03-29 10:23:34
在第一个示例中,指针和实际字符串内容之间必须有所不同:虽然指针(string2)位于堆栈上,但实际的字符串字节不是。它们在常量区有很好的变化,是只读的,因此出现了分段故障。
发布于 2012-03-29 10:26:10
首先,行为是没有定义的。来自C99,6.4.5/6:
未指定这些数组是否不同,只要它们的元素具有适当的值。如果程序试图修改这样的数组,则行为是未定义的。
实际上,操作系统选择了在只读内存中加载相关的图像部分;因此,当您尝试编写时会出现分段错误。
https://stackoverflow.com/questions/9923436
复制相似问题