2D阵列...打印额外的元素?

时间:2014-01-10 04:59:20

标签: c

我有以下计划。我无法理解发生了什么。它打印了一个额外的元素,我必须是一个转储人?不能成功为什么?请帮帮我!

 #include <stdio.h>

 int main(){
         int n[3][3] = {2, 4, 3, 6, 8, 5, 3, 5, 1};
         int i = 0, j=0;
         int *ptr = &n;

         for(i=0; i<3; i++)
             for(j=0; j<9; j++)
         {
            printf("%d\t",*((ptr+i)+j)) ;
         }
         system("pause");
         return 0;
  }

1 个答案:

答案 0 :(得分:3)

这完全不是如何访问2D数组的元素。这里有几个问题。首先,您正在循环ij - 但由于您从j 0开始8,因此当您遇到麻烦时达到值i> 0。你可以做到

#include <stdio.h>

int main(){

  int n[3][3] = {2, 4, 3, 6, 8, 5, 3, 5, 1};

  int j=0;   
  int *ptr = &n[0][0];

  for(j=0; j<9; j++)
  {
     printf("%d\t",*(ptr+j)) ;
  }

  return 0; 
}

它有点简单,但保持代码的本质 - 因为它设置指向数组开头的指针,并递增此指针。一些变化:

#include <stdio.h>

int main(){

  int n[3][3] = {2, 4, 3, 6, 8, 5, 3, 5, 1};

  int j=0;   
  int *ptr = &n[0][0];

  for(j=0; j<9; j++)
  {
     printf("%d\t",*(ptr++)) ;
  }

  return 0; 
}

#include <stdio.h>

int main(){

  int n[3][3] = {2, 4, 3, 6, 8, 5, 3, 5, 1};

  int i, j;   
  int *ptr = &n[0][0];

  for(i=0; i<9; i+=3)
  {
    for(j=0; j<3; j++)
    {
     printf("%d\t",*(ptr+i+j)) ;
    }
  }

  return 0; 
}

当然还有旧的待命:

#include <stdio.h>

int main(){

  int n[3][3] = {2, 4, 3, 6, 8, 5, 3, 5, 1};

  int i, j;   

  for(i=0; i<3; i++)
  {
    for(j=0; j<3; j++)
    {
     printf("%d\t",n[i][j]);
    }
  }

  return 0; 
}

看看这些不同的方法对你有意义。如果他们不这样做,请提出问题。

编辑对您的程序进行简单修改可以更好地显示原始代码中的错误:

#include <stdio.h>

int main(){
  int i, j;

  for(i=0; i<3; i++)
    for(j=0; j<9; j++)
    {
       printf("i = %d; j = %d; i + j = %d\n", i, j, i+j);
    }
   return 0;
}

在内部循环中打印出ij的值(您尝试依次打印数组元素)。你得到:

i = 0; j = 0; i + j = 0
i = 0; j = 1; i + j = 1
i = 0; j = 2; i + j = 2
i = 0; j = 3; i + j = 3
i = 0; j = 4; i + j = 4
i = 0; j = 5; i + j = 5
i = 0; j = 6; i + j = 6
i = 0; j = 7; i + j = 7
i = 0; j = 8; i + j = 8
i = 1; j = 0; i + j = 1
i = 1; j = 1; i + j = 2
i = 1; j = 2; i + j = 3
i = 1; j = 3; i + j = 4
i = 1; j = 4; i + j = 5
i = 1; j = 5; i + j = 6
i = 1; j = 6; i + j = 7
i = 1; j = 7; i + j = 8
i = 1; j = 8; i + j = 9
i = 2; j = 0; i + j = 2
i = 2; j = 1; i + j = 3
i = 2; j = 2; i + j = 4
i = 2; j = 3; i + j = 5
i = 2; j = 4; i + j = 6
i = 2; j = 5; i + j = 7
i = 2; j = 6; i + j = 8
i = 2; j = 7; i + j = 9
i = 2; j = 8; i + j = 10

正如您所看到的那样,您打印的元素太多了,并且您“脱离了边缘”,因为i + j&gt; 8您正在访问超出已分配内存的内存。这导致了未定义的行为。但这通常是一件坏事。