为什么会发生以下情况:
char s[2] = "a";
strcpy(s,"b");
printf("%s",s);
- >执行没有问题
char *s = "a";
strcpy(s,"b");
printf("%s",s);
- >段错误
第二种变体不应该为s
分配2个字节的内存,因此有足够的内存来复制"b"
吗?
答案 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错误。
我遵循的规则:声明指针变量不会创建变量类型,它指向。它创建一个指针变量。因此,如果您指向字符串缓冲区,则需要指定字符数组和缓冲区指针,并指向字符数组的地址。