atoi函数的未定义行为

时间:2016-01-18 16:35:03

标签: c string atoi

以下代码显示了一种奇怪的行为:

int main()
{
    char numArr[] = {'9','8','5'};
    int num;
    printf("%d\n",num);
    num = atoi(numArr);
    printf("%d\n",num);
    return 0;
}

我没有初始化num所以它包含一个垃圾值(在我的情况下为51),当我将atoi()的返回值存储在num中时,垃圾是覆盖并获取atoi返回的值351的字符),以便转换后的输出为9853而不是{{ 1}}。

如果我使用任何值初始化num并且没有看到任何附加内容,它也会显示正确的行为。

  • 如果我在ideone中尝试它,它会得到正确的结果(因为它们会自动使用0初始化num),但在我的机器上的code :: blocks中会出现不合需要的效果。

我想知道为什么垃圾值被追加到返回值?

2 个答案:

答案 0 :(得分:5)

  

我想知道为什么垃圾值被追加到返回值   ?

因为将垃圾值附加到返回值是未定义行为的有效行为。

更一般:具有未定义行为的程序没有 - 您是客户 - 定义的行为。那就是程序可以崩溃,可以输出任何东西,可以输出和崩溃,可以输出而不是结束......你明白了。

你有两个UB来源:

  • 访问未初始化的变量num

  • 没有空的终止字符串作为参数传递给atoi

答案 1 :(得分:2)

因为atoi需要一个以空字符结尾的字符串,所以它会扫描直到得到一个字符串,然后它会偶然发生,以便有一个'3'

尝试:

char numArr[] = {'9','8','5', 0};