#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 申请一段内存,并将参数复制进去,因此这个变量位于堆内存上,也是可写的。其实在后两句中,会「隐式」地创建一个「字符串字面量」,然后将它复制到一段可写内存上。