2012-04-02 22 views
0

我已经写了两段代码,我打算输出相同的输出,但容易混淆,输出不同。修改和打印字符串不会导致预期的输出

代码的第一片:

#include<stdio.h> 
int main(){ 
    char a[]="abc"; 
    char *p=&a; 
    char c=++(*p); 
    printf("%c,%s\n",c,p); 
    return 0; 
} 

此输出以下:

B,BBC

第二件的代码:

#include<stdio.h> 
int main(){ 
    char *p="abc"; 
    char c=++(*p); 
    printf("%c,%s\n",c,p); 
    return 0; 
} 

,其输出:

一个,ABC

什么在第二代码段,其防止字符串的第一个字符从递增发生?

+0

它可能发生在某些系统中,因为第二个代码的“abc”位于无法更改的内存区域中。在第一个应用程序中,字符串“abc”在堆栈中始终可以修改。 – rbelli 2012-04-02 16:08:34

回答

4

第二个示例试图更改未定义行为的字符串文字。你通常会因为这样做而崩溃,但在你的情况下,它似乎只是“被忽略”。

char *p="abc"; 
char c=++(*p); /* Illegal to change *p. */ 

标准报价:

它是unspeci音响ED这些阵列是否是不同的提供 其元素具有适当的值。如果程序 试图修改这样一个数组,行为是不确定的。

+0

* p ++在这个表达式中哪个运算符会得到优先 – 2012-04-02 16:04:45

+1

@CallYS但是你使用了括号。 – cnicutar 2012-04-02 16:05:27

+0

我还有一个疑问..... #include int main(){ char * p; char * a =“yogi”; p = a; char c = ++(* p); printf(“%c,%s,%s”,c,p,a); return 0; } 这次输出的是y,yogi,yogi 但我期待z,zogi,yogi。 – 2012-04-03 09:25:43