数组的奇数输出

时间:2013-07-17 20:16:26

标签: c arrays

我在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编译器。输出不同的原因可能是操作系统和编译器不同。

8 个答案:

答案 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)

像其他人说的一样。未初始化的值不保证为0.这适用于所有变量,而不仅仅是整数。一个好的做法是将所有变量初始化为某个默认值,以确保它没有垃圾值,这些垃圾值可能会让你后来搞砸。