【问题标题】:Iterating over un-initialized array in C [duplicate]在C中迭代未初始化的数组[重复]
【发布时间】:2014-09-07 01:31:12
【问题描述】:

所以我前段时间遇到了这个问题,无法弄清楚它的问题,但它让我想知道它为什么有效。我没有摆在我面前的问题,但我会尽力从记忆中重复它。

为什么这两段代码在 C 中的输出完全相同?其中一个显然是错误的。

代码 1:

int main()
{
   int a;
   int b[] = {1,2,3,4};
   for(a = 0; a<4; a++)
      printf("%i\n",b[a]);
   return;
}

代码 2:

int main()
{
   int a;
   int b[] = {1,2,3,4};
   for(a = 0; a<4; a++)
      printf("%i\n",a[b]);
   return;
}

两段代码的输出是:

1
2
3
4

有人告诉我这与堆栈和内存位置有关,但解释不够清楚。谁能帮忙更清楚地解释一下?

【问题讨论】:

  • 其实语法是正确的。唯一的问题是 printf() 中缺少双引号。
  • 这两个程序都不是远程正确的。 b 也不是数组,因此 b 的初始化程序出现故障。返回int 的函数不应包含没有值的returnprintf() 语句需要双引号。我们假设两者都以#include &lt;stdio.h&gt; 开头;如果他们不这样做,他们应该这样做。
  • 当您查看此评论时,代码中的一些问题可能已通过一次或多次编辑修复(有一个待定的编辑修复了最严重的语法问题)。程序之间的唯一区别是b[a]a[b]printf() 语句中的使用。重复的问题涵盖了这一点。
  • @Mo2 抱歉,我的第一条评论不是很好。正如@JonathanLeffler 同时回答的那样,问题是将b 声明为int(而不是int[])。一旦解决了这个问题,行为就如其他答案所解释的那样。如果编译你的代码,我的编译器只给了我一个关于虚假初始化程序的警告,但在 int 使用 another int 下标的那一行出现错误。

标签: c loops memory stack


【解决方案1】:

这是C语言中的简单指针等价:

b[a] = *(b + a) = *(a + b) = a[b]

这是一个有用的链接,提供了更深入的解释[pointer tutorial]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多