cygwin char指针和char地址-------比较两个scanf程序

时间:2013-10-11 05:49:01

标签: c pointers cygwin scanf

我最近使用cygwin和gcc一个简单的c程序,但发生了一些奇怪的事情,我不知道为什么?

#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
▒

2 个答案:

答案 0 :(得分: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 :(得分:1)

尝试扫描未初始化的指针

像这样修改

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