Вы используете указатели на массивы, поэтому не следует индексировать их напрямую, так как p[i]
даст *(p+i)
, т.е. массив, следующий за указанным на p, а не элемент p.
В C void*
преобразуется в любой тип указателя, поэтому вам не нужно приводить результат malloc. Если вы введете приведение, оно может маскировать ошибки, например, если вы пытаетесь назначить не указатель (например, p[i]
).
В malloc для p, 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;
}
Однако, поскольку использование указателя на массив не является преимуществом по сравнению с использованием указателя на его первый элемент, но это означает, что вам нужно разыменовать перед получением элемента, гораздо проще использовать указатель на форму указателя .