我想在指针的帮助下扫描一个二维数组,并编写了这段代码,你能告诉我为什么编译器会出错吗?我知道如何使用双指针做同样的事情,我正在试验这个。
#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 :(得分:1)
您正在使用指向数组的指针,因此您不应直接对其进行索引,因为p[i]
将给出*(p+i)
,即p指向的数组后面的数组,而不是p的元素。
在C中,void*
将转换为任何指针类型,因此您不需要转换malloc的结果。如果您确实放置了强制转换,它可以掩盖错误,例如,如果您尝试分配非指针(例如p[i]
)。
在p的malloc中,sizeof(int (*p)[a])
应该使用类型或表达式,而不是声明。 p
是指向int数组的指针数组的指针,因此*p
元素的类型为int (*)[]
。
所以这在gcc上编译没有错误或警告:
#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 = malloc ( b * sizeof ( int ( * ) [] ) );
for ( i = 0;i < b;i++ ) {
( *p ) [i] = malloc ( a * sizeof ( int ) );
printf ( "\t\bEnter Column %d\t\n", i );
for ( j = 0;j < a;j++ )
scanf ( "%d", & ( * ( *p ) [i] ) [j] );
}
return 0;
}
但是,由于使用指向数组的指针对使用指向其第一个元素的指针没有任何优势,但它确实意味着你必须在获取元素之前取消引用,因此使用指针到指针表单要容易得多
答案 1 :(得分:1)
你知道int (*(*p)[])[]
是什么吗?
试试cdecl.org ... http://cdecl.ridiculousfish.com/?q=int+%28%2A%28%2Ap%29%5B%5D%29%5B%5D
使用1维数组并假装它是2维数组
就是这样
/* Oh ... and use spaces in your code */
/* They are extremely cheap now a days */
#include <assert.h>
/* instead of asserting malloc and scanf, use proper error checking */
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int i, j, n, rows, cols;
int *p; /* 1. */
printf("Enter the size of the matrix in the form aXb\n");
n = scanf("%dX%d", &rows, &cols);
assert((n == 2) && ("scanf failed"));
p = malloc(rows * cols * sizeof *p); /* 2. */
assert((p != NULL) && "malloc failed");
for (i = 0; i < rows; i++) {
int rowindex = i * cols; /* 3. */
for (j = 0; j < cols; j++) {
n = scanf("%d", &p[rowindex + j]); /* 3. and 4. */
assert((n == 1) && "scanf failed");
}
}
free(p); /* 5. */
return 0;
}
答案 2 :(得分:0)
使用指针访问数组元素的问题是不必要的。 尝试使用简单的指向指针p。
int **p;
...
p=malloc(a*sizeof(int *)); //create one pointer for each row of matrix
...
for(i=0;i<a;i++)
{
...
p[i]=malloc(b*sizeof(int)); //create b integers in each row of matrix
...
}