1

我最近使用了 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
▒
4

2 回答 2

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*

于 2013-10-11T05:51:02.507 回答
1

试图扫描到未初始化的指针

像这样修改

char* in=malloc(1);
    scanf("%c",in);
    printf("%c\n",*in);
                  ^^ You should use *in to print the value  
于 2013-10-11T05:52:44.233 回答