2

首先,我为糟糕的英语道歉。

在下一个简单的程序中,

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;
}

我在运行时输入了一个大写字母,导致FATAL错误,通过kill proccess解决。

它不会在下一个代码中引起任何问题。

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

4

2 回答 2

8

这之间的区别

int a;
scanf("%c", &a);

还有这个

int a = 0;
scanf("%c", &a);

int a;声明一个未初始化的a. 所以它可以是任何东西。当你写

scanf("%c", &a);

在 uninitialized 上int,您只设置最高位,因为%c告诉scanf将输入写入 a char,因此只会写入第一个字节。这可能会导致一些奇怪的行为,包括你刚才所说的。

于 2012-06-04T18:03:16.803 回答
2

您已经声明了一个未初始化的 int a,并将它的最低字节设置为某个值。结果可能是一个非常大的数字,因为最高字节(无论是 16 位还是 32 位整数)未分配/未初始化。

当您将它传递给函数时,这将使用 int a表示的完整范围。然后,您设置了一个循环,停止条件“直到它到达'Z'”,顺便说一句,它将被正确提升为整数(即​​所有最上面的未使用字节为 0)。

在那个周期中,您将迫使糟糕的 printf 尝试输出一个从 0 到 0xff 的字节,数十亿次,具体取决于i翻转到“Z”可能需要多长时间......显然在那个 printf 代码的某个地方,有人不喜欢不可打印的(不仅仅是非ascii)代码。

于 2012-06-04T18:35:07.807 回答