2

我在 Stephen G. Kochan 的“Programming in C”一书中学习数组。尽管长时间尝试查找语法错误,但我已经对输出感到非常困惑。

这是我的代码:

#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 Home Premium 64 位,并且我使用的是 gcc (GCC) 4.7.2 编译器。不同输出的原因可能是不同的操作系统和编译器。

4

8 回答 8

8

这是那本书的引述,来自您引用的输出之后的段落:

因为您从未分配values给数组中的五个元素(元素 1、4 和 6 到 8)values,所以为它们显示的元素毫无意义。即使程序的输出将这些值显示为零,但未定义任何未初始化变量或数组元素的值。出于这个原因,不应假设未初始化的变量或数组元素的值。

道德:当你真正阅读编程书籍时,你会从它们中得到更多。

于 2013-07-17T22:15:35.570 回答
7

在 C 中,默认情况下不初始化数组的元素。

你试一试 :

int values[10] = {0};

在编程中,假设每个未初始化的指针和非指针变量都包含垃圾是一个好习惯。

编辑 : 如果这本书没有向你解释……我会像其他人一样,建议你找一本新书…… 看来这本书实际上是在谈论您可能会发现未初始化变量的垃圾值......

于 2013-07-17T20:20:18.820 回答
3

C 不会将数组的元素归零。这就是为什么这些元素没有初始化为零的原因;您只是看到那些内存位置中已经存在的垃圾值。

如果您的书说 C 将数组的元素归零,请买一本新书

于 2013-07-17T20:19:39.093 回答
2

您的语法似乎没有任何错误。系统非常快速地重用内存,如此之快以至于系统不会在将内存交给要使用的进程之前将所有值重置为 0。

在为变量赋值之前,始终假定变量包含垃圾是一种很好的编程习惯。这与非指针变量一样适用于指针。C/C++ 中的数组变量实际上是指向连续内存块的指针,因此系统通过主要针对速度进行调整的内部进程分配该内存。花时间将内存块中的所有值设置为 0 会降低系统向您返回内存的速度;此外,假设在几乎所有情况下,您真的不希望携带一大块零值,而是将您自己的数据放入其中。

检查您正在阅读的书,看看稍后是否有关于此行为的注释。如果书中不存在这样的注释,您可能会考虑阅读其他来源,以确保您不会遇到作者做出的其他可能不准确的假设。

于 2013-07-17T20:31:19.257 回答
1

您在索引 4、6、7、8.. 处得到垃圾值,数组元素的默认值是垃圾(如果您不初始化),您应该声明您的数组并用0值初始化您的数组,就像这样:

int values[10] = {0};

这会将所有value[i]设置为零。(记住不完整的初始化将未初始化的值设置为 0)。

于 2013-07-17T20:18:55.253 回答
0

您不初始化元素 1、4、6、7 和 8。要将整个数组设置为零,请像这样初始化它:

int values[10] = {0};
于 2013-07-17T20:18:37.700 回答
0

初始化数组。您尚未初始化数组,因此它充满了垃圾值。这样做:

int values[10] = {0};

好的做法是始终初始化变量。我建议你也改变你的书。试试“ Dietel & Dietel 的 C -How to Program

于 2013-07-17T20:22:25.223 回答
0

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

于 2013-07-17T20:30:32.527 回答