为什么strcpy会在char * s中失败而在char [1024]中失败?

时间:2012-06-12 09:42:42

标签: c segmentation-fault

为什么会发生以下情况:

char s[2] = "a";
strcpy(s,"b");
printf("%s",s);

- >执行没有问题

char *s = "a";
strcpy(s,"b");
printf("%s",s);

- >段错误

第二种变体不应该为s分配2个字节的内存,因此有足够的内存来复制"b"吗?

3 个答案:

答案 0 :(得分:12)

char *s = "a";

指针s指向字符串文字"a"。尝试写入此函数具有未定义的行为,因为在许多系统中,字符串文字存在于程序的只读部分中。

历史事故中,字符串文字的类型为char[N]而不是const char[N],这会使其更加清晰。

答案 1 :(得分:5)

  

第二种变体不应该为s分配2个字节的内存,因此有足够的内存来复制“b”吗?

不,char *s指向包含字符串"a"的静态内存地址(写入该位置会导致您遇到的段错误)而char s[2];本身则提供所需的空间字符串。

如果您想手动为字符串分配空间,可以使用动态分配:

char *s = strdup("a"); /* or malloc(sizeof(char)*2); */
strcpy(s,"b");
printf("%s",s); /* should work fine */

之后不要忘记free()你的字符串。

答案 2 :(得分:1)

以不同的方式/回答:我认为错误在于你没有创建指针必须指向的变量,因此也就是seg错误。

我遵循的规则:声明指针变量不会创建变量类型,它指向。它创建一个指针变量。因此,如果您指向字符串缓冲区,则需要指定字符数组和缓冲区指针,并指向字符数组的地址。