我最近使用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
▒
答案 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