该代码旨在制作3个2D阵列(3x3)。 ar1由1组成,ar2的对角线分量等于2,否则为0。 ar3是ar1和ar2的每个对应索引的总和。我已经为此使用了嵌套for循环,但由于某种原因,外部for循环连续迭代i = 1。有谁知道如何解决这个问题?
#include <stdio.h>
#define SIZE 2
int main(void)
{
int i = 0, j, ar1[2][2], ar2[2][2], ar3[2][2];
for(i = 0; i<=SIZE; i++)
{
for(j = 0; j<=SIZE; j++)
{
ar1[i][j] = 1;
if(i == j)
ar2[i][j] = 2;
else
ar2[i][j] = 0;
ar3[i][j] = ar1[i][j] + ar2[i][j];
printf("%-4d", ar3[i][j]);
}
printf("\n");
}
return 0;
}
答案 0 :(得分:3)
此代码在i == SIZE
int i = 0, j, ar1[2][2], ar2[2][2], ar3[2][2];
for(i = 0; i<=SIZE; i++)
{
for(j = 0; j<=SIZE; j++)
{
ar1[i][j] = 1;
未定义的行为。
在您的情况下,根据您所描述的内容,通过在ar
内存外写字,您将覆盖i
或j
,其值为1
,会重置索引到1
(数组可能位于编译器索引变量之前的)。那就解释了。
所以修复是
int i = 0, j, ar1[SIZE][SIZE], ar2[SIZE][SIZE], ar3[SIZE][SIZE];
for(i = 0; i<SIZE; i++)
{
for(j = 0; j<SIZE; j++)
{
ar1[i][j] = 1;
依此类推......(请注意,如果您将SIZE
定义为2
,最好还使用它来初始化数组)
BTW如果你想制作3x3阵列,你必须将SIZE
设置为3
#define SIZE 3
所以第一个有效索引是0,最后一个有效索引是2
答案 1 :(得分:3)
在任何编程语言中,基本上有两种方法可以在1到N循环中编写&#34; for i&#34;:
for(i = 1; i <= N; i++) /* "one-based" */
for(i = 0; i < N; i++) /* "zero-based" */
尽早了解并充分了解这一点:在C中,基于0的循环非常受欢迎。这与C使用基于0的数组的事实密切相关。您偶尔会看到一个基于1的循环,但这种情况很少见,只会在您执行特殊操作时才会出现。但初始化一些普通数组并不特别。
每当您看到一个与上述两种模式之一不匹配的循环时,例如
for(i = 1; i < N; i++) /* questionable */
for(i = 0; i <= N; i++) /* questionable */
这应该是一个迹象,表明一些更不寻常的东西 - 可能是错误的 - 正在发生。循环for(i = 1; i < N; i++)
总共进行了N-1次旅行。循环for(i = 0; i <= N; i++)
总共进行N + 1次旅行。
如果要迭代大小为SIZE的数组,则总是要使用
for(i = 0; i < SIZE; i++)
形式,因为数组的索引从0到SIZE-1。
通过允许循环运行到i=SIZE
,您可以访问阵列外部的内存。具体来说:由于SIZE
为2,因此有效索引仅为0和1.当您将i
或j
设置为2时,您将访问阵列外部的内存。
在这种情况下,通过访问阵列外部的内存,您可能无意中覆盖了i
和/或j
变量。 (具体来说,您可能将i
或j
设置为0或1,这意味着它永远不会达到SIZE。)这可能是循环永远运行的原因。