如果我声明一个二维数组为
#include <stdio.h>
#include <stdlib.h>
int main() { int c=5;int r=6;
int **a=(int **) malloc (c*sizeof(int *));
int i,j;
for (i=0;i<c;i++){
*(a+i)=(int *) malloc (r*sizeof (int));
}
}
以上程序运行成功。
#include <stdio.h>
#include <stdlib.h>
int main() { int c=5;int r=6;
int **a;
**a=(int **) malloc (c*sizeof (int *));
int i,j;
for (i=0;i<c;i++){
*(a+i)=(int *) malloc (r*sizeof (int));
}
}
但是编译器在上面的程序中显示一个错误。
为什么?如有任何帮助,我将不胜感激。
您声明了一个未初始化且值不确定的类型为int **
的指针。
int **a;
然后在下一个语句中对指针解引用两次
**a=(int **) malloc (c*sizeof (int *));
表达式**a
为int
类型,而右侧表达式为int **
类型。
编译器发出一个消息,告诉操作数的类型不同。
此外,如果要运行这样的程序,对未初始化的指针解引用将导致未定义的行为。
你至少应该写
a=(int **) malloc (c*sizeof (int *));
注意如果在第一个程序中变量r
表示行变量c
表示列那么你应该按行分配数组也就是程序应该是这样的
#include <stdio.h>
#include <stdlib.h>
int main() { int c=5;int r=6;
int **a=(int **) malloc (r*sizeof(int *));
int i;
for (i=0;i<r;i++){
*(a+i)=(int *) malloc (c*sizeof (int));
}
}
否则表达式a[i]
将生成一个列而不是一个行。
按上面所示分配数组后,表达式**a
就等于表达式a[0][0]
,并产生存储在第一行第一列中的类型为int
的对象。