c数组编程
我正在读Kochan的C语言编程,第三版 在阵列简介(程序7.1)中,他给出了一个示例:c数组编程,c,arrays,C,Arrays,我正在读Kochan的C语言编程,第三版 在阵列简介(程序7.1)中,他给出了一个示例: #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] = va
#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;
}
通过我的四重检验,我使用的是完全相同的代码,它只起到了一半的作用,给了我一些奇怪的额外数字a[1],[4]
values[0] = 197
values[1] = 3210052
values[2] = -101
values[3] = 547
values[4] = 17704192
values[5] = 350
values[6] = 0
values[7] = 0
values[8] = 0
values[9] = 35
我正在使用
cl数组.c-o数组
进行编译。局部变量未初始化。这意味着数组中未显式初始化的条目将包含不确定值(被视为随机值)
实际上,使用未初始化的变量(或数组的未初始化项)是未定义的行为。它们未初始化,因此您在控制台输出中看到的是相同内存位置中的内容
您可能想知道为什么第一个示例会为每个未初始化的值和实现中的“wierd number”指定“0”……也许第一个示例分配到了以前从未使用过的内存区域,或者某些编译器决定将每个引用但未初始化的内存寄存器设置为0x0000000,如果您查看本书中提供的cod,它从不设置数组项1或4的值。因此,它们是未定义的,可以是任何值。有些编译器可能会将它们初始化为零,但这不是C规范的一部分,永远不应该依赖它。我在书中阅读了解释该程序的文本,其中清楚地指出(第100页): 由于从未为数组元素1、4和6到8中的五个元素赋值,因此为它们显示的值没有意义。即使这个项目 输出将这些值显示为零,即任何未初始化变量或数组元素的值 没有定义。出于这个原因,不应假设某一资产的价值 未初始化的变量或数组元素
这就是标准所说的,未初始化的自动局部变量调用未定义的行为。如果这是本书中的确切代码,我建议找一本不同的书。我试图找到答案,并在发布后找到了相关主题的响应,我将尝试阅读更多内容,不管怎样,如果有人得到了答案,那将非常有帮助。我觉得价值[10]在书中是一个全局变量。如果不是的话,我同意hacks和crashmstr。好的,谢谢。您在代码中发现错误了吗?@user3101661代码中没有明显的错误——错误在于假设未初始化的值为0。他们将成为他们碰巧成为的任何人;它依赖于系统、编译器和编译器开关。如果不设置函数中定义的变量,它会有一些值,但不能保证值是多少。这就解释了一点,我在程序前面编译了[5]个数组,所以[0]-[5]是有问题的,上面的“工作”。谢谢大家!
values[0] = 197
values[1] = 3210052
values[2] = -101
values[3] = 547
values[4] = 17704192
values[5] = 350
values[6] = 0
values[7] = 0
values[8] = 0
values[9] = 35