Ошибка выделения памяти
Функция в программе предназначена для ввода чисел в матрицу, почему происходит ошибка выделения памяти?
#define x 2
#define y 3
void input_matrix(int ** p);
int main()
{
int a[x][y];
input_matrix(**a);
return 0;
}
void input_matrix(int ** p)
{
for (int i=0; i<x; i++)
{
for (int j=0; j<y; j++)
{
printf("p[%d][%d] = ", i, j);
scanf( "%d", (*(p+i)+j) );
}
printf("\n");
}
}
Ответы (3 шт):
input_matrix(**a); -- таким образом вы передаете не указатель, а разыменованное значение, находящееся по адресу элемента a[0][0], поэтому у вас и ошибка. К тому же, при такой работе с массивом, а именно статическим определением и попыткой передать указатель на него, вы получите ошибку несовместимости типов. Вам нужно выделить память динамически через calloc() или malloc(), а потом уже передавать указатель в функцию input_matrix()
Вот пример (print_matrix() для демонстрации):
#include <stdio.h>
#include <stdlib.h>
#define x 2
#define y 3
void input_matrix(int** p);
void print_matrix(int** p);
int main()
{
int** a;
a = (int **) calloc(x, sizeof(int *)); // Выделение памяти под массив
for (int i = 0; i < x; i++) { // Выделение памяти под массив
a[i] = (int *) calloc(y, sizeof(int)); // Выделение памяти под массив
}
input_matrix(a);
print_matrix(a);
for (int i = 0; i < x; i++) { // Высвобождение памяти
free(a[i]); // Высвобождение памяти
} // Высвобождение памяти
free(a); // Высвобождение памяти
return 0;
}
void input_matrix(int ** p) {
for (int i=0; i<x; i++) {
for (int j=0; j<y; j++) {
printf("p[%d][%d] = ", i, j);
scanf( "%d", (*(p+i)+j) );
}
printf("\n");
}
}
void print_matrix(int ** p) {
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
printf("%d ", *(*(p + i) + j));
}
printf("\n");
}
}
Достаточно привести тип:
int a[x][y];
int **ptr = (int**)&a;
input_matrix(ptr);
Вот так — *(p+i)+j — точно не получится, потому что у вас p имеет тип int**, так что p+i — указатель на i-й указатель, а не на i-ю строку матрицы.
Надо либо действовать, как описал rusgeli, либо передавать в функцию матрицу
void input_matrix(int p[][y]);
и тогда ваш код будет работать, либо передавать
void input_matrix(int *p);
и обращаться к элементу как к
*(p+y*i+j)
Смотрите сами, какой из трех вариантов вам удобнее.