我想借助指针扫描一个二维数组并编写这段代码,你能告诉我为什么编译器会出错吗?
#include<stdio.h>
#include<stdlib.h>
int main(void) {
int i,j,n,a,b;
int (*(*p)[])[];
printf("\n\tEnter the size of the matrix in the form aXb\t\n");
scanf("%dX%d",&a,&b);
p=(int (*(*p)[b])[a])malloc(b*sizeof(int (*p)[a]));
for(i=0;i<b;i++) {
p[i]=(int (*p)[a])malloc(a*sizeof(int));
printf("\t\bEnter Column %d\t\n");
for(j=0;j<a;j++)
scanf("%d",&p[i][j]);
}
return 0;
}
答案 0 :(得分:2)
这是一种非常扭曲的语法。通常在制作2D数组时:
int *p;
p = malloc(a*b*sizeof(int));
p[i][j]
。您必须执行以下操作之一 - 创建包含行指针的辅助数组int **q
以便能够编写q[i][j]
(更好的性能和易读性),或者编写p[b*i + j]
(更少的步骤) 另外,请注意:
关于我能想到的最接近的东西,它类似于你想要做的事情:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i, j;
const int a = 3, b = 4;
int m[4][3];
int (*p[4])[3];
for (i = 0; i < b; i++)
{
p[i] = &m[i];
printf("\t\bEnter Column %d\t\n", i);
for (j = 0; j < a; j++)
{
int x;
scanf("%d", &x);
(*p[i])[j] = x;
}
}
return 0;
}
它按预期编译和运行,但它毫无意义。 p
是一个指向数组的指针数组。
答案 1 :(得分:2)
这句话有几个问题:
p=(int (*(*p)[b])[a])malloc(b*sizeof(int (*p)[a]));
首先,malloc
返回void*
。您正在使用(int (*(*p)[b])[a])
来转换该指针,这会产生一个值,而不是数据类型。这不是一个有效的演员,所以这是编译器对你大吼大叫的一个原因。此时,p
尚未初始化,因此如果执行此语句,此处发生的取消引用可能会导致程序崩溃。
在malloc
来电中,您正在使用sizeof(int (*p)[a])
。语句int (*p)[a]
不是有效的C语句。
似乎你正在使它变得更加复杂。有两种构建2D阵列的方法。 Reinderien解释说,您可以使用malloc(a * b * sizeof(int))
构建数组。您还可以构建一个指针数组,每个指针指向一个类型为int
的数组。从您的代码中,您似乎正在尝试执行后者。
更简单的方法是这样的:
int **p;
... get input from user ...
// Declare an array of int pointers of length b
p = malloc(b * sizeof(int*));
// For each int* in 'p' ...
for (i = 0; i < b; ++i) {
// ... allocate an int array of length 'a' and store a pointer in 'p[i]' ..
p[i] = malloc(a * sizeof(int));
// ... and fill in that array using data from the user
printf("\t\bEnter Column %d\t\n");
for(j = 0; j < a; j++)
scanf("%d", &p[i][j]);
}
使用这种构建2D数组的方法,您可以使用语法p[x][y]
。由于p
是指向指针的指针,p[x]
是指向数组的指针,p[x][y]
是指向数组中的项。