我在Stephen G. Kochan撰写的“Programming in C”一书中学习了Arrays。尽管很长时间试图找到语法错误,但我已经达到了我对输出感到困惑的程度。
这是我的代码:
#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[0] = 197
values[1] = -2
values[2] = -101
values[3] = 547
values[4] = 4200832
values[5] = 350
values[6] = 4200926
values[7] = 4200832
values[8] = 7680288
values[9] = 35
就像所有零(未初始化的值)已被这些大数字所取代。发生了什么,怎样才能改变它?
更新
Peter Griffiths提到了这一点,这是Stephen G. Kochan撰写的“Programming in C 3rd edition”一书中引用的:
因为您从未为数组中的五个元素指定值 - 元素1,4和6到8 - 为它们显示的值是没有意义的。尽管程序的输出显示了这些 值为零,任何未初始化的变量或数组的值 元素未定义。因此,不应该有任何假设 关于未初始化的变量或数组元素的值。
这清楚地表明这本书没有任何问题。所以这不是一本不好的书!只有很好的体验!
我使用的是Windows 7家庭高级版64位,我使用的是gcc(GCC)4.7.2编译器。输出不同的原因可能是操作系统和编译器不同。
答案 0 :(得分:8)
以下是该书的引用,从您引用的输出后面的段开始:
因为您从未将
values
分配给该中的五个元素 数组 - 元素1,4和6到8 -values
为他们显示是没有意义的。即使程序的输出 将这些值显示为零,任何未初始化的变量或值 数组元素未定义。因此,不应该有任何假设 关于未初始化的变量或数组的值 元件。
道德:当你真正阅读它们时,你会从编程书中获得更多。
答案 1 :(得分:7)
在C中,默认情况下不会初始化数组的元素。
试试吧:
int values[10] = {0};
在编程中,假设每个非初始化指针和非指针变量都包含垃圾是一个好习惯。
编辑:
如果这本书没有向你解释......我会像其他人一样,建议你找一本新书...... 。
看来这本书实际上谈的是你可以用uninitialise变量找到的垃圾值......
答案 2 :(得分:3)
C不会将数组元素归零。这就是为什么这些元素没有初始化为零;你只是看到那些内存位置已有的垃圾值。
如果您的图书说C确实将数组元素归零,获取新书。
答案 3 :(得分:2)
您的语法似乎没有任何错误。系统可以非常快速地重用内存,以便在将内存交给要使用的进程之前系统不会将所有值重置为0。
在为其分配值之前,始终假设您的变量包含垃圾是一种很好的编程习惯。这适用于指针和非指针变量一样多。 C / C ++中的数组变量实际上是指向连续内存块的指针,因此系统通过主要针对速度调整的内部进程分配该内存。花时间将内存块中的所有值设置为0会降低系统向您返回内存的速度;此外,假设几乎在所有情况下你真的不希望携带一大块零值,而是将你自己的数据放入其中。
检查您正在阅读的书籍,看看以后是否有关于此行为的说明。如果书中不存在这样的注释,您可以考虑阅读其他来源,以确保您不会遇到作者所做的其他可能不准确的假设。
答案 4 :(得分:1)
你在索引4,6,7,8得到垃圾值,数组元素的默认值是垃圾(如果你没有初始化),你应该声明你的数组并用0
初始化你的数组价值,只是喜欢:
int values[10] = {0};
这会将所有value[i]
设置为零。 (记住不完整的初始化设置未初始化的值为0)。
答案 5 :(得分:0)
您不初始化元素1,4,6,7和8.要将整个数组设置为零,请将其初始化为:
int values[10] = {0};
答案 6 :(得分:0)
初始化数组。您尚未初始化数组,因此它充满了垃圾值。这样做:
int values[10] = {0};
好的做法是始终初始化变量。 我建议你改变你的书。 试试“C -How to Program by Dietel & Dietel”
答案 7 :(得分:0)