我正在尝试在7.1
c programming by stephen kochen
#include<stdio.h>
int main(void)
{
int values[10];
int index;
values[0]=197;
values[2]=-100;
values[5]=350;
values[3]=values[0]+values[5];
values[9]=values[5]/10;
--values[2];
for(index=0;index<10;++index)
printf("values[%i] = %i \n",index,values[index]);
return 0;
}
预期输出应为
values[0] = 197
values[1] = 0
values[2] = -101
values[3] = 547
values[4] = 0
values[5] = 350
values[6] = 0
values[7] = 0
values[8] = 0
values[9] = 35
但我收到的输出是相同的,除了values[8]
的值不匹配。我收到的价值是values[8] = 1501817896
。我无法弄清楚为什么?
因为看起来有点混乱。这是我收到的输出
values[0] = 197
values[1] = 0
values[2] = -101
values[3] = 547
values[4] = 0
values[5] = 350
values[6] = 0
values[7] = 0
values[8] = 1501817896
values[9] = 35
答案 0 :(得分:1)
您尚未初始化values[8]
以及更多(并且它们具有不确定的价值)。
为什么不好
C99第6.7.8节初始化:
如果自动存储持续时间的对象不已初始化 显然,它的价值是不确定的。
第3.18节未定义的行为:
使用不可移植或错误的程序构造时的行为 错误的数据,或不确定的对象,为此 国际标准没有要求。
因此,在C
中访问未初始化的值为Undefined behaviour,可能会打印任何值或可能会陷阱。
<强>修正强>
将您的声明更改为:
int values[10] = {0};
明确初始化所有未初始化的值。
将数组移至全局范围或将其设为static
。
答案 1 :(得分:0)
您未初始化values
;你只是使用它。这是不确定的行为,无论作者声称什么,因此,您无法对values[8]
作出任何您未设定的假设。
<小时/> 的修改
它不是真正未定义的行为(包括崩溃等),但是从未初始化的变量获得的值只是非确定性的。
在您的情况下,这意味着您的程序不会崩溃(因为它不会访问不存在的内存),而是您没有设置值的索引的输出不确定。
答案 2 :(得分:0)
使用它来了解发生这种情况的原因。
#include<stdio.h>
int main(void)
{
//int values[10] = {0};
int values[10];
int index;
for(index=0;index<10;++index)
printf("values[%i] = %i \n",index,values[index]);
values[0]=197;
values[2]=-100;
values[5]=350;
values[3]=values[0]+values[5];
values[9]=values[5]/10;
--values[2];
for(index=0;index<10;++index)
printf("values[%i] = %i \n",index,values[index]);
return 0;
}
在我的机器上,我得到以下内容......
values[0] = 0
values[1] = 0
values[2] = 0
values[3] = 0
values[4] = 0
values[5] = 0
values[6] = 0
values[7] = 0
values[8] = 1553679856
values[9] = 32767
values[0] = 197
values[1] = 0
values[2] = -101
values[3] = 547
values[4] = 0
values[5] = 350
values[6] = 0
values[7] = 0
values[8] = 1553679856
values[9] = 35
我的values[8]
也未设置为0
。这是因为C在分配时没有零值数组。为此,您可以使用此
int values[10] = {0};
如果它是动态数组使用
int values = calloc(10, sizeof(int));
许多人多年的调试时间都花在了这些问题上。