Это утверждение имеет несколько проблем:
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-массива. Вы можете построить массив, используя malloc(a * b * sizeof(int))
, как объясняет Рейндинен. Вы также можете построить 1D массив указателей, каждый из которых указывает на массив типа 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]
- это элемент в массиве с указателем.
Какие ошибки вы получаете? Какой компилятор вы используете? Вы строите это как C или C++? – bta
Не забудьте «освободить» все объекты, на которые вы выделили память. – pmg
Вы понимаете, что такое указатель? Из этого кода кажется, что вы думаете, что это массив, из 'int (* (* p) []) [];', что совершенно неверно. – alternative