2015-06-08 50 views
1

如标题所说,我的程序崩溃时,当我尝试打印一个二维阵列。 错误肯定是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"); 
    } 

} 
+1

如果您询问用户的'n'和'm'值,为什么使用'ROW'和'COL'? –

+0

你从调试器中发现了什么? –

+0

'printarray(array [n] [m],n,m);' - >'printarray(array,n,m);' –

回答

-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"); 
    } 

} 
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"); 
    } 

} 

同样适用于在主回路。

功能无效的这一呼吁

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。

而且这是一个坏主意,L'意大利语英语混用。:)

+0

参见Vlad,存在一个基本问题'main()'也是。由于阵列尺寸是固定的,因此不清楚它是否超出边界。不过,我也相信,这是这里的主要问题。 :-) –

+0

@Natasha Dutta谢谢你指出。:) –

+0

随时。干杯! –

1

由于以下原因,发布的代码不能干净地编译。

1)缺少

#include <time.h> 

2)main()函数总是返回 'INT',以便适当的主声明将是: 'INT主(无效)'

3)的第一个参数'printarray()'被定义为指向2维数组的指针。

然而,

a)所述实际呼叫通过在阵列中特定的“细胞”的内容。

b)传递的“单元格”超出了数组的末尾。

建议:'printarray(array,n,m)'作为调用语句。

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

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

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

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

在内存中,数组从左到右(列)然后从上到下(行)排列。

'最大'索引是行,应该首先列出。 5)为了避免文本替换问题,宏中的数值应该被包装在parens中。

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

7)调用scanf()的(和家庭的功能时)经常检查返回的值(不是参数值),以确保操作成功

8)一致的缩进使得代码更容易被我们读取/理解人类,建议:在每个开启的括号后面缩进4个空格'{'和un - 在每个大括号'}'之前缩进。注意:切勿使用制表符来缩进。不同的环境具有不同的制表符宽度和/或不同的制表位。 9)为了便于阅读,并且为了使调试更容易,只需在每行代码中放置一条语句。这适用于声明变量,因此可以很容易地对它们进行注释并应用于可执行语句