2013-10-11 67 views
1

我最近用了cygwin和gcc一個簡單的c程序,但是發生了一些奇怪的事情,我不知道爲什麼?cygwin字符指針和char地址-------比較兩個scanf程序

#include <stdio.h> 

int main(void) { 
    char in; 
    scanf("%c",&in); 
    printf("%c\n",in); 
    return 0; 
} 

它輸出這些:

$ ./a.exe 
1 
1 

而下一個節目,

#include <stdio.h> 

int main(void) { 
    char* in; 
    scanf("%c",in); 
    printf("%c\n",in); 
    return 0; 
} 

它輸出這些:

$ ./a.exe 
1 
▒ 

回答

3

因爲在第二代碼(讀註釋):

int main(void) { 
    char* in; // garbage value 
    scanf("%c",in); // storing at garbage address 
    printf("%c\n",in); 
    return 0; 
} 

in是一個未初始化的指針,指向垃圾位置 - 未定義的行爲。

當然在語法上它是正確的!您可以按如下方式使用它:

int main(void) { 
    char c; 
    char* in = &c; // pointing to valid address 
    scanf("%c",in); 
    printf("%c\n", *in); 
    return 0; 
} 

通知我變化的printf添加*引用操作打印值

printf("%c\n", *in); 
      ^

要打印地址使用%p和類型轉換地址void*

1

嘗試掃描成未初始化指針

修改如下

char* in=malloc(1); 
    scanf("%c",in); 
    printf("%c\n",*in); 
        ^^ You should use *in to print the value