首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >2D array...Printing额外元素?

2D array...Printing额外元素?
EN

Stack Overflow用户
提问于 2014-01-10 12:59:20
回答 1查看 106关注 0票数 0

我有下面的程序。我不能理解到底发生了什么。它打印了一个额外的元素,我一定是个垃圾人?为什么做不到?请帮帮我!

代码语言:javascript
复制
 #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;
  }
EN

回答 1

Stack Overflow用户

发布于 2014-01-10 13:10:52

这根本不是访问二维数组元素的方式。首先,您同时遍历ij -但是由于您将j0传递到8,当您遇到值i>0时,您将遇到麻烦。你可以这样做

代码语言:javascript
复制
#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; 
}

它稍微简单一点,但保留了代码的精髓--它设置了一个指向数组开头的指针,并递增这个指针。

代码语言:javascript
复制
#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; 
}

代码语言:javascript
复制
#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; 
}

代码语言:javascript
复制
#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; 
}

看看这些不同的方法对你是否有意义。如果他们不这样做,就问问题。

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

代码语言:javascript
复制
#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的值(您尝试依次打印数组元素的地方)。你会得到:

代码语言:javascript
复制
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 >8时,您访问的内存超出了分配的内存。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21036506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档