int main(void) {
char *p = "hello";
char *q = "world";
*p = *q;
printf("%s", *p);
}
我试图用世界覆盖你好......
答案 0 :(得分:11)
尝试修改字符串文字会导致未定义的行为。例如,某些实现将该字符串存储在内存的只读部分中。你不能(也不应该尝试)覆盖那个记忆。
答案 1 :(得分:11)
您只是覆盖hello
的第一个字符,即h
,其中第一个字符为world
,即w
。
另外,如果您想坚持原始代码,
p = q;
printf("%s", p);
此外,使用p = q
您不会覆盖任何内容。 p
现在指向world
的第一个字符。
正如Ed所述,您无法使用p
中的数据覆盖q
中存储的数据。
答案 2 :(得分:5)
这一行:
*p = *q;
将p指向的char(单数)设置为q指向的char。
如果要复制字符串,则需要strncpy
。 (尽管请参阅Ed关于代码中字符串的只读性质的评论)。
答案 3 :(得分:2)
首先,您的代码只会尝试使用“World”的第一个字符覆盖“Hello”的第一个字符,即它会尝试将“Hello”变为“Wello”。
其次,您正在尝试修改字符串文字。 Sitring litrerals不可修改。你不能“覆盖”字符串文字。您尝试使用“世界”覆盖“Hello”与尝试使用5
8
覆盖5 = 8
并没有太大区别。
如需进一步阅读,请参阅Why is this string reversal C code causing a segmentation fault?
第三,为了使用printf
打印字符串,您必须将指针传递给第一个字符,而不是第一个字符本身。您的printf
应该看起来像printf("%s", p)
答案 4 :(得分:1)
如果要打印“world”,则不传递指针的地址,然后需要将字符串世界的地址传递给指针“hello”,这可以通过编写p=q;
来实现。< / p>
问题解决了。其余代码是正确的。
答案 5 :(得分:0)
char * p =“你好”; char * q =“世界”; 两个变量都是不变的,不可改变的
答案 6 :(得分:0)
两者都是L值所以不能改变..... 导致分段错误或任何运行时逻辑错误
所以使用
是安全的p=q;
因为现在p开始指向q指向的字符串