在堆栈内存和堆内存上使用memcpy有什么区别?以下代码适用于Tru64但LINUX上的段错误
char * string2 = " ";
(void)memcpy((char *)(string2),(char *)("ALT=---,--"),(size_t)(10));
Run Code Online (Sandbox Code Playgroud)
第二个版本适用于LINUX
char * string2 = malloc(sizeof(char)*12);
(void)memcpy((char *)(string2),(char *)("ALT=---,--"),(size_t)(10));
Run Code Online (Sandbox Code Playgroud)
有人可以解释LINUX上的段错误吗?
第一个示例具有未定义的行为.因此它可能正常工作或显示任何随机行为.
Explanation:
第一个示例声明了一个指向string2字符串文字的指针.字符串文字存储在Implementation定义的只读存储器位置中.不允许用户程序修改此内存.任何这样做的尝试都会导致未定义的行为.
参考:
C99标准6.4.5/5"字符串文字 - 语义":
在转换阶段7中,将值为零的字节或代码附加到由字符串文字或文字产生的每个多字节字符序列.然后使用多字节字符序列初始化静态存储持续时间和长度的数组,该数组足以包含序列.对于字符串文字,数组元素的类型为char,并使用多字节字符序列的各个字节进行初始化; 对于宽字符串文字,数组元素的类型为wchar_t,并使用宽字符序列进行初始化...
如果这些数组的元素具有适当的值,则这些数组是否不同是未指定的.如果程序试图修改此类数组,则行为未定义.
| 归档时间: |
|
| 查看次数: |
3477 次 |
| 最近记录: |