为什么它会导致运行时错误,字符为int而不进行初始化?

时间:2012-06-04 17:58:53

标签: c++

首先,我为英语不好道歉。

在下一个简单的程序中,

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 ++

2 个答案:

答案 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)代码。