用c语言如何定义含有变量N的一个 二位数组 #int n;scanf(“%d”,&n);int a[n][n]={0};为什么不对啊

如题所述

在C语言中,数组的大小在定义的时候必须确定大小,不然在编译阶段进行内存分配的时候,计算机不知道该给数组分配多大的内存单元,所以会报错。


对于如下程序段:

int n;
scanf("%d", &n);
int a[n][n]={0};

错误有2处:

1、数组的定义与声明部分应该放到执行语句的前面,即scanf语句之前;

2、由于在编译阶段变量n的值是未知的,所以数组a的大小也是未知的,因此计算机就不知道该给数组分配多大的内存空间,造成编译错误。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-11-18
可以这样:
int n;
scanf("%d",&n);
int *a=(int*)malloc((n*n)*sizeof(int)); /* 申请 n*n 个 int型单元 */
然后,将一维数组映射到二维数组,即:
a[i*n+j] 为二维数组 第 i 行第 j 列元素(i,j=0,1,...,n-1)。例如:
#include<stdio.h>
#include<stdlib.h>

int main () {
int i,j,k;
int n;
printf("n=?");
scanf("%d",&n);
int *a=(int*)malloc((n*n)*sizeof(int)); /* 申请 n*n 个 int型单元 */
for(i=0; i<n; i++){
for(j=0; j<n; j++){
k=i*n+j;
scanf("%d",&a[k]);
}
}
for(i=0; i<n; i++){
for(j=0; j<n; j++){
k=i*n+j;
printf("%d\t",a[k]);
}
printf("\n");
}
free(a); /* 任务完成后,释放内存 */
return 0;
}
第2个回答  2011-11-18
这个错误是因为a[][]这种二维数组个数一定要是确定的,即括号中一定是确定的数,而你这里n是变量,比较简便的方法就是将二维数组的个数定义多一些。比如说a[1000][1000]本回答被提问者采纳
第3个回答  2011-11-18
在编译的时候就要为数组a分配好空间,由于n是未知,编译器不知道该分配多大空间给这个数组,就会报错了。不过,现在支持新的C标准的编译器可以这样干。
第4个回答  2011-11-18
再加一个变量m,int[n][m(这个不能和n重复)]
相似回答