尝试打印二维数组时程序崩溃

时间:2015-06-08 10:48:25

标签: c multidimensional-array printf

正如标题所说,当我尝试打印二维数组时,我的程序崩溃了。 函数printf中的错误肯定是printarray,但我无法理解它导致崩溃的原因。

#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#define COL 40
#define ROW 40
void printarray(int array[COL][ROW], int col, int row);

main (){
    int n,m,p,q;
    int array[COL][ROW];
    printf("Dammi 2 numeri \n"); scanf("%d",&n); scanf("%d",&m);
    do{
        printf("Dammi 2 p[<n] e q[<m] \n"); scanf("%d",&p); scanf("%d",&q);
    }while(p>=n || q>=m);

    printf("Mi hai dato: n= %d m= %d p= %d q= %d \n",n,m,p,q);

         int i,j;
         int random;
         srand(time(NULL));
         for(i=0; i<=n;i++){
              for(j=0; j<=m;j++){
                 do{   
                       random = rand() % 10;
                 }while(random == 0);
                 printf("\n i am at array[%d][%d] with number: %d\n",i,j,random);
                 array[i][j] = random;
              }
         }

    //printf("lol0 ->>>>>>>>>>>%d<--------",array[0][0]);
    printarray(array[n][m],n,m);

system("PAUSE");
}

void printarray(int array[COL][ROW], int col, int row){
     int i,j;
     for(i=0; i<=col;i++){
              //printf("lol3 %d",i);
              for(j=0; j<=row; j++){
                       printf("%d",array[i][j]);
              }
              printf("\n");
     }

}

3 个答案:

答案 0 :(得分:4)

如果数组维度的大小为N,则索引的有效范围为[0, N - 1]。 所以函数中的循环应该看起来像

void printarray(int array[COL][ROW], int col, int row){
     int i,j;
     for(i=0; i< col;i++){
              //printf("lol3 %d",i);
              for( j=0; j<row; j++){
                       printf("%d",array[i][j]);
              }
              printf("\n");
     }

}

同样适用于main中的循环。

此函数调用无效

printarray(array[n][m],n,m);

应该有

printarray(array,n,m);

考虑到像

这样的数组声明
int array[COL][ROW];

非常混乱。写

会更正确
int array[ROW][COL];
          ^^^  ^^^

此循环

中变量p和q的含义还不清楚
does not make sense
    printf("Dammi 2 numeri \n"); scanf("%d",&n); scanf("%d",&m);
    do{
        printf("Dammi 2 p[<n] e q[<m] \n"); scanf("%d",&p); scanf("%d",&q);
    }while(p>=n || q>=m);

似乎这个循环来自其他程序。:)

你必须检查n和m是否大于ROW和COL。

将意大利语与英语混合起来也是一个坏主意。:)

答案 1 :(得分:1)

由于多种原因,发布的代码无法完全编译。

1)缺少

 #include <time.h>  

2)function main()总是返回&#39; int&#39;所以一个适当的主要陈述是:&#39; int main(void)&#39;

3)&#39; printarray()&#39;的第一个参数被定义为指向二维数组的指针。

然而,

a)实际通话传递特定“小区”的内容。在数组中。

b)通过的&#39;小区&#39;超出阵列的末尾。

建议:&#39; printarray(array,n,m)&#39;作为调用声明。

注意,在C中,数组名称降级为数组中第一个条目的地址。

4)数组应定义为arrayName [numRows] [numColumns]。

当声明指针数组时,这将变得更加重要,其中每个指针将指向相关行的内容。

在发布的代码中,定义/命名是典型的倒退。

在Memory中,一个数组从左到右(列)然后从上到下(行)排列。

最大的&#39; index是行,应该先列出。

5)为避免文本替换问题,宏中的数值应包含在parens中。

6)作为建议,代码块之间适当的垂直间距(空白行)使代码更清晰,更容易被人类理解

7)当调用scanf()(和函数族)时,总是检查返回值(而不是参数值)以确保操作成功

8)一致的缩进使我们的人类更容易阅读/理解代码,建议:在每个开口支撑后缩进4个空格&#39; {&#39;并且在每个结束括号之前取消缩进&#39;}。注意:切勿使用制表符进行缩进。不同的环境具有不同的标签宽度和/或不同的制表位。

9)为了便于阅读,并且为了使调试更容易,每行代码只放置一个语句。这适用于声明变量,因此可以轻松地对它们进行注释并应用于可执行语句

答案 2 :(得分:-1)

这里我正在附加你的程序,没有任何错误。问题是调用printarray函数。

     #include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#define COL 40
#define ROW 40
void printarray(int array[COL][ROW], int col, int row);

main (){
    int n,m,p,q;
    int array[COL][ROW];
    printf("Dammi 2 numeri \n"); scanf("%d",&n); scanf("%d",&m);
    do{
        printf("Dammi 2 p[<n] e q[<m] \n"); scanf("%d",&p); scanf("%d",&q);
    }while(p>=n || q>=m);

    printf("Mi hai dato: n= %d m= %d p= %d q= %d \n",n,m,p,q);

         int i,j;
         int random;
         srand(time(NULL));
         for(i=0; i<=n;i++){
              for(j=0; j<=m;j++){
                 do{   
                       random = rand() % 10;
                 }while(random == 0);
                 printf("\n i am at array[%d][%d] with number: %d\n",i,j,random);
                 array[i][j] = random;
              }
         }

    //printf("lol0 ->>>>>>>>>>>%d<--------",array[0][0]);
    printarray(array,n,m);

system("PAUSE");
}

void printarray(int array[COL][ROW], int col, int row){
     int i,j;
     for(i=0; i<=col;i++){
              //printf("lol3 %d",i);
              for(j=0; j<=row; j++){
                       printf("%d",array[i][j]);
              }
              printf("\n");
     }

}