int main(void) {
char *p = "hello";
char *q = "world";
*p = *q;
printf("%s", *p);
}
我试图覆盖招呼与世界......C指针问题
int main(void) {
char *p = "hello";
char *q = "world";
*p = *q;
printf("%s", *p);
}
我试图覆盖招呼与世界......C指针问题
您只需覆盖hello
的第一个字符,即h
,并且第一个字符为world
即w
。
另外,如果你要坚持你的原代码,
p = q;
printf("%s", p);
此外,与p = q
你不覆盖任何东西。 p
现在指向world
的第一个字符。
由于Ed表示,您不能用q
中的数据覆盖存储在p
中的数据。
尝试修改不确定的行为一个字符串结果。例如,一些实现会将该字符串存储在内存的只读部分。您不能(也不应该尝试)覆盖该内存。
这条线:
*p = *q;
将设置炭(单数)指向的P向炭指向用q。
如果你想复制字符串,你想要strncpy
。 (尽管参见Ed关于代码中字符串的只读性质的评论)。
为了记录,'* cpy()'函数在这里没有帮助,因为数据存储在只读存储器中。但+1解释他的逻辑错误。 – 2009-11-05 02:19:35
正确 - 我假设这是一个基本的指针问题。 (最初我没有看到数据部分的问题--C#让我柔和) – geofftnz 2009-11-05 22:39:18
char * p =“hello”; char * q =“world”; 这两个变量是不变的,不可改变的
这是不正确的。变量不是const,它们指向的是。 – 2009-11-05 02:21:42
即使这是不正确的。 C中的字符串文字不是常量(按类型)。它们只是不可修改的。这不完全是一回事。 – AnT 2009-11-05 02:23:56
我的意思是内容p和q的引用是固定的,你不能改变内容 – 2009-11-05 03:20:47
首先,您的代码只会尝试用“世界”的第一个字符覆盖“Hello”的第一个字符,即它试图将“Hello”变成“Wello”。
其次,你正试图修改一个字符串文字。坐着litrerals是不可修改的。你不能“覆盖”字符串文字。用“World”覆盖“Hello”的尝试与通过执行5 = 8
以8
覆盖5
的尝试没有什么不同。
进一步的阅读可见Why is this string reversal C code causing a segmentation fault?
第三,为了打印字符串printf
你有一个指针传递到第一个字符,而不是第一个字符本身。你的printf
应该看起来像printf("%s", p)
如果你想打印“世界”,你没有传递指针的地址,那么你需要将字符串世界的地址传递给指针“hello”,这是通过写p=q;
。
问题解决。其余的代码是正确的。
两者都是L值所以不能改变..... 导致段故障或运行时出现逻辑错误
因此它是安全的使用
p=q;
像现在P开始指向字符串Q是指向
有亚去,10K。 – GManNickG 2009-11-05 02:33:31
它是C的一个错误特性(因为遗留原因),字符串文字的类型为char *而不是const char *。 – 2009-11-05 02:54:14
他们**不保证是只读的,其实施已定义。许多较早的编译器使字符串文字变为可变的。 – 2012-11-28 07:34:42