2009-11-05 185 views
1
int main(void) { 
    char *p = "hello"; 
    char *q = "world"; 
    *p = *q; 
    printf("%s", *p); 
} 

我试图覆盖招呼与世界......C指针问题

回答

11

您只需覆盖hello的第一个字符,即h,并且第一个字符为worldw

另外,如果你要坚持你的原代码,

p = q; 
printf("%s", p); 

此外,与p = q不覆盖任何东西p现在指向world的第一个字符。

由于Ed表示,您不能用q中的数据覆盖存储在p中的数据。

11

尝试修改不确定的行为一个字符串结果。例如,一些实现会将该字符串存储在内存的只读部分。您不能(也不应该尝试)覆盖该内存。

+4

有亚去,10K。 – GManNickG 2009-11-05 02:33:31

+1

它是C的一个错误特性(因为遗留原因),字符串文字的类型为char *而不是const char *。 – 2009-11-05 02:54:14

+0

他们**不保证是只读的,其实施已定义。许多较早的编译器使字符串文字变为可变的。 – 2012-11-28 07:34:42

5

这条线:

*p = *q; 

将设置炭(单数)指向的P向炭指向用q。

如果你想复制字符串,你想要strncpy。 (尽管参见Ed关于代码中字符串的只读性质的评论)。

+2

为了记录,'* cpy()'函数在这里没有帮助,因为数据存储在只读存储器中。但+1解释他的逻辑错误。 – 2009-11-05 02:19:35

+0

正确 - 我假设这是一个基本的指针问题。 (最初我没有看到数据部分的问题--C#让我柔和) – geofftnz 2009-11-05 22:39:18

0

char * p =“hello”; char * q =“world”; 这两个变量是不变的,不可改变的

+0

这是不正确的。变量不是const,它们指向的是。 – 2009-11-05 02:21:42

+0

即使这是不正确的。 C中的字符串文字不是常量(按类型)。它们只是不可修改的。这不完全是一回事。 – AnT 2009-11-05 02:23:56

+0

我的意思是内容p和q的引用是固定的,你不能改变内容 – 2009-11-05 03:20:47

2

首先,您的代码只会尝试用“世界”的第一个字符覆盖“Hello”的第一个字符,即它试图将“Hello”变成“Wello”。

其次,你正试图修改一个字符串文字。坐着litrerals是不可修改的。你不能“覆盖”字符串文字。用“World”覆盖“Hello”的尝试与通过执行5 = 88覆盖5的尝试没有什么不同。

进一步的阅读可见Why is this string reversal C code causing a segmentation fault?

第三,为了打印字符串printf你有一个指针传递到第一个字符,而不是第一个字符本身。你的printf应该看起来像printf("%s", p)

1

如果你想打印“世界”,你没有传递指针的地址,那么你需要将字符串世界的地址传递给指针“hello”,这是通过写p=q;

问题解决。其余的代码是正确的。

0

两者都是L值所以不能改变..... 导致段故障或运行时出现逻辑错误

因此它是安全的使用

p=q; 

像现在P开始指向字符串Q是指向