2016-07-30 39 views
-1

有人能帮我理解这种行为......?C指针输出,不是我期望的那个

我有这样

#include <stdio.h> 
int main() 
{ 
    char *ptr = "Hello"; 
    printf("%c ",++*ptr); 
    return 0; 
} 

一个片段予预期(记住++的precendence顺序和*和R与L的关联),其输出应为

I (the letter I) 

但事实并非如此,程序崩溃了。

所以请有人解释,我在这里想念什么?

+1

您试图修改字符串文字 - 这是未定义的行为。 –

+0

@Paul Hankin,你的意思是它被视为const?请解释一下 – eRaisedToX

回答

1

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); 
+0

ohk ..明白了,但这是否意味着* ptr是const? – eRaisedToX

+0

如何在OP代码中修改字面值? – ameyCU

+0

@ameyCU'++ * ptr = ++(* ptr)'因此它会尝试修改该数组中的第一个字符,即'H' – artm

-1

你的代码几乎是好的,但它需要一个轻微的修改,

#include <stdio.h> 
int main() 
{ 
    char *ptr = "Hello"; 
    printf("%c ",*(++ptr)); 
    return 0; 
} 

说明:正在发生,因为根据你的代码(++*ptr)将在由指向的地址递增值,而不是ptr本身。但为了增加存储在ptr中的地址,我们需要先增加它,然后取消引用该指针以获取存储在该值的数据。

+0

好,但为什么我们不能修改ptr指向的值?我的意思是我没有把它声明为const ... – eRaisedToX

+0

@eRaisedToX当你声明'char * ptr =“Hello”;'时,它存储在只读存储器中,你不应该修改它。 – ameyCU

+0

是的@ameyCU是正确的! – SKG