У этого оператора есть несколько проблем:
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.
Кажется, вы делаете это немного сложнее, чем нужно.Существует два способа построения двумерного массива.Вы можете создать массив, используя 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]);
}
Использование этого метода построения двумерного массива позволяетвам использовать синтаксис p[x][y]
.Поскольку p
является указателем на указатель, p[x]
является указателем на массив, а p[x][y]
является элементом в указанном массиве.