一个c指针问题

时间:2009-11-05 02:14:36

标签: c

int main(void) {
    char *p = "hello";
    char *q = "world";
    *p = *q;
    printf("%s", *p);
}

我试图用世界覆盖你好......

7 个答案:

答案 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指向的字符串