1

我的 C 有一种我不理解的行为。

我已经定义了一个数组如下

long gainT1[21];

我对那个变量做了一些工作(因此,不需要初始化),然后,我想显示它包含的值。问题来了:第二个 for 显示的第一个值不是预期的值!

printf("CHECKING: gainT1[0]=%ld\n", gainT1[0]);
{
    ptrdiff_t k;
    for(k = 0; k < 16; k++) printf("[%td]=%ld   ", k, gainT1[k]); printf("\n");
    for(k = 0; k < 17; k++) printf("[%td]=%ld   ", k, gainT1[k]); printf("\n"); // Here the for is going up to 16 instead of 15 previously
}

此代码返回:

检查:增益T1[0]=4207440

[0]=4207440 [1]=4207440 [2]=4294967295 [3]=139846275105333 [4]=16351504 [5]=0 [6]=139846268659528 [7]=139846277253568 [8]=16351504 [9]=3 [10]=128 [11]=139846277252304 [12]=4294967295 [13]=139846272645590 [14]=0 [15]=0

[0]=2356216002 [1]=4207440 [2]=4294967295 [3]=139846275105333 [4]=16351504 [5]=0 [6]=139846268659528 [7]=139846277253568 [8]=16351504 [9] [10]=128 [11]=139846277252304 [12]=4294967295 [13]=139846272645590 [14]=0 [15]=0 [16]=6312008

我无法弄清楚我的代码有什么问题。

4

3 回答 3

1

我用那​​个变量做一些工作”是相当不确定的。如果在 for 循环中,您正在访问一个实际上仍未定义的元素,则任何事情都可能发生,包括出现的奇数值。

所以,最简单的就是这样做:

long gainT1[21] = { 0 };

任何非设定值将至少为零。

(注意:我知道这个数组初始化适用于 c99;不确定例如 c89 或 c90。)

于 2012-12-03T10:56:38.577 回答
0

如果您显示整个代码,那么很容易得到确切的错误,但是由于您提供的代码较少,所以我认为您应该尝试一下。

您可以使用printf()来显示ptrdiff_t. 根据 1999 C 标准,格式字符串应包含 t 长度修饰符和 d 或 i 转换说明符,如下所示:

ptrdiff_t d;
...
printf("%td", d);

尽管说明%d符与 C 一样长,但%t修饰符还是相当新的。很少有 C 库支持它。如果您的编译器不支持%td,那么您应该尝试%ld,如下所示:

printf("%ld", (long)d);

ptrdiff_t使用标准 C++库显示iostreama 与显示任何其他数字类型一样简单:

std::cout << d;
于 2012-12-03T09:30:56.483 回答
0

当您帮助我理解问题一定出在其他地方时,我创建了一个新项目,删除了尽可能多的行,这似乎是一个初始化问题:由于数组未正确初始化,因此值不稳定。问题是否出现取决于编译选项,因此请记住,即使变量看起来无用,也要始终正确初始化变量。

于 2012-12-03T10:35:26.787 回答