以下代码显示了一种奇怪的行为:
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
返回的值3
(51
的字符),以便转换后的输出为9853
而不是{{ 1}}。
如果我使用任何值初始化num并且没有看到任何附加内容,它也会显示正确的行为。
我想知道为什么垃圾值被追加到返回值?
答案 0 :(得分:5)
我想知道为什么垃圾值被追加到返回值 ?
因为将垃圾值附加到返回值是未定义行为的有效行为。
更一般:具有未定义行为的程序没有 - 您是客户 - 定义的行为。那就是程序可以崩溃,可以输出任何东西,可以输出和崩溃,可以输出而不是结束......你明白了。
你有两个UB来源:
访问未初始化的变量num
和
没有空的终止字符串作为参数传递给atoi
。
答案 1 :(得分:2)
因为atoi
需要一个以空字符结尾的字符串,所以它会扫描直到得到一个字符串,然后它会偶然发生,以便有一个'3'
。
尝试:
char numArr[] = {'9','8','5', 0};