【问题标题】:C printf of a long type array not properly working [closed]长类型数组的 C printf 无法正常工作 [关闭]
【发布时间】:2012-12-03 09:16:54
【问题描述】:

我的 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
}

此代码返回:

检查:gainT1[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]=3 [10]=128 [11]=139846277252304 [12]=4294967295 [13]=139846272645590 [14]=0 [15]=0 [16]=6312008

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

【问题讨论】:

  • 请添加gainT1的声明和赋值。
  • ... 并且您确定您的编译器不会给您一个讨厌的警告,例如:警告:格式 '%d' 需要类型 'int',但参数 2 的类型为 ' ptrdiff_t'?
  • 您没有提供足够的信息,请添加代码,以免人们猜测。
  • 正如我在之前的评论中所说,您显示的代码没有任何问题(请参阅:ideone.com/ixdekv)...

标签: c arrays loops


【解决方案1】:

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

所以,最简单的方法就是:

long gainT1[21] = { 0 };

任何未设置的值都将至少为零。

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

    std::cout << d;
    

    【讨论】:

    • 你好akp,虽然你是对的,但它并没有解决问题。 [%td]=%ld 给出相同的结果。
    • @sdenel 你能显示实际的整个代码吗???
    • (yo)u 只使用粗体字有什么具体原因吗?此外,这个问题被明确标记为 C,而不是 C++。不要提供其他语言的解决方案。
    • @Zeta 仅用于关注重要的事情..
    • @akp:我不愿意给你整个初始化和显示之间的相当长的代码,但我认为它不会给你更多信息,因为两者之间没有做任何事情循环,gainT1 没有链接到任何外围设备。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-16
      • 2014-04-15
      • 1970-01-01
      相关资源
      最近更新 更多