首先,我为英语不好道歉。
在下一个简单的程序中,
void fx(int *a){
for(int i=*a; i<='Z'; i++)
printf("%c", i);
}
int main(){
int a;
scanf("%c", &a);
fx(&a);
return 0;
}
我在运行时输入了一封大写字母,它导致了致命错误,并通过杀死过程解决了。
下一个代码不会造成任何问题。
//except fx()
int main(){
int a;
scanf("%c", &a);
return 0;
}
或
//initialize int a
void fx(int *a){
for(int i=*a; i<='Z'; i++)
printf("%c", i);
}
int main(){
**int a = 0;**
scanf("%c", &a);
fx(&a);
return 0;
}
我知道输入字符应该是'char'。但我无法理解上述情况。
发生了什么事?
PS。我使用VS2010,c ++
答案 0 :(得分:8)
这个
之间的区别int a;
scanf("%c", &a);
和这个
int a = 0;
scanf("%c", &a);
是int a;
声明未初始化的a
。所以它可以是任何东西。当你写
scanf("%c", &a);
在未初始化的int
上,您只设置最顶端的位,因为%c
告诉scanf
将输入写入char
,因此只有第一个字节将写。这可能会导致一些奇怪的行为,包括你刚才所说的内容。
答案 1 :(得分:2)
您已声明未初始化的 a ,并将其设置为最低字节。结果可能是一个非常大的数字,因为最高字节(无论是16位还是32位整数)是未分配/未初始化的。
当你将它传递给函数时,这个将使用int a 表示的完整范围。然后你设置一个循环,停止条件“直到它到达'Z'”,顺便说一句,它将被正确地提升为一个整数(即所有最高的未使用字节为0)。
在那个循环中,你会强迫较差的printf尝试输出一个从0到0xff的字节,几十亿次,具体取决于 i 所需的时间翻转到'Z'...显然在printf代码的某处,有人不喜欢不可打印(不仅仅是非ascii)代码。