#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时会产生