C语言 如何消除错误在二维数组声明使用指针?



如果我声明一个二维数组为

#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 *));

表达式**aint类型,而右侧表达式为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的对象。

相关内容

  • 没有找到相关文章

最新更新