C指针输出,不是我期望的那个
有人能帮我理解这种行为......?C指针输出,不是我期望的那个
我有这样
#include <stdio.h>
int main()
{
char *ptr = "Hello";
printf("%c ",++*ptr);
return 0;
}
一个片段予预期(记住++的precendence顺序和*和R与L的关联),其输出应为
I (the letter I)
但事实并非如此,程序崩溃了。
所以请有人解释,我在这里想念什么?
char * ptr =“Hello”;
ptr是字符串文字,你不应该改变它。
如果你想改变,使用数组来代替:
char ptr[] = "Hello";
printf("%c ",++*ptr);
注意,在你原来的代码char *ptr = "Hello";
,ptr
不是一个常量指针,它可以改变,以点别的东西。
因为"Hello"
字符串存储在只读存储器中,所以只要ptr
指向它,就不能修改ptr
指向的数据。
但是,总的来说,你可以改变ptr
指向其他地方,以及它所指向的数据可以被修改,例如,
char *ptr = "Hello"; // data cannot be modified by ptr
char arr[] = "abcd";
ptr = arr; // data can be modified by ptr
printf("%c ",++*ptr);
ohk ..明白了,但这是否意味着* ptr是const? – eRaisedToX
如何在OP代码中修改字面值? – ameyCU
@ameyCU'++ * ptr = ++(* ptr)'因此它会尝试修改该数组中的第一个字符,即'H' – artm
你的代码几乎是好的,但它需要一个轻微的修改,
#include <stdio.h>
int main()
{
char *ptr = "Hello";
printf("%c ",*(++ptr));
return 0;
}
说明:正在发生,因为根据你的代码(++*ptr)
将在由指向的地址递增值,而不是ptr本身。但为了增加存储在ptr
中的地址,我们需要先增加它,然后取消引用该指针以获取存储在该值的数据。
好,但为什么我们不能修改ptr指向的值?我的意思是我没有把它声明为const ... – eRaisedToX
@eRaisedToX当你声明'char * ptr =“Hello”;'时,它存储在只读存储器中,你不应该修改它。 – ameyCU
是的@ameyCU是正确的! – SKG
您试图修改字符串文字 - 这是未定义的行为。 –
@Paul Hankin,你的意思是它被视为const?请解释一下 – eRaisedToX