首页 > 请问一个 memcpy 的问题

请问一个 memcpy 的问题


#include<stdio.h> #include<stdlib.h> #include<string.h> main() { char* src = "abc123"; char* dest = "test";// 这样会发生 segmentation fault (core dumped) //char dest[10] = "test";//success 这样成功执行 //char* dest = strdup("test");//success 这样成功执行 memcpy(dest, src, strlen(src)+1); printf(" %s\n", dest); } //关于 memcpy 复制字符串时,memcpy(dest, src, strlen(src)+1) , 目标字符串dest 类型 char *xxx , char xxx[] 有什么不同 , char * 会发生 segmentation fault (core dumped) , 而 char xxx[] 不会 , 但 strdup 后的 char * 就能成功执行 。

char *x = "xyz"; 的标准写法是 const char *x = "xyz";, 通常用来表示「字符串字面量」,即编译器会把这个字符串放到常量区,因此向其中写入数据会发生错误。

char[] 是一个数组,被置于自动变量区,因此可以改变它的值。

strdup 会用 malloc 申请一段内存,并将参数复制进去,因此这个变量位于堆内存上,也是可写的。

其实在后两句中,会「隐式」地创建一个「字符串字面量」,然后将它复制到一段可写内存上。


char* dest = "test";在一些编译器编译后分配的是只读空间是一个原因,另一个很显而易见,但是楼上没有人说,我补充一下。
"test"一共分配5个字节的内存。你往里面copy的"abc123"长度是7个,显然越界了嘛,你在什么编译器下面编译都会发生 segmentation fault (core dumped)的。
简单的这样写很糟糕memcpy(dest, src, strlen(src)+1);这就是万恶之源,不搞清内存大小后面会带来无尽的痛苦的。


char *x = "xyz"分配的空间是否可写,取决于编译器把"xyz"是否放到了可写的数据段中,
这一点是具体编译器实现相关的,并不是所有的编译器都放到只读数据段中的,
gcc的默认编译参数是把“xyz”分配在只读数据段中的,所以memcpy时会产生

【热门文章】
【热门文章】