Здесь происходит две основные вещи:
- Когда вы объявляете указатель, например,
int* x
, это создает глобальную переменную для хранения местоположения массива целых, но не создает фактический массив самих целых. Если вы просто сделаете это объявление, а затем выполните *x = 0;
, вы получите ошибку (вероятно). На самом деле создание массива требует выделения памяти с помощью вызова malloc
. Эта статья описывает основы.
- Типы многомерных массивов немного забавны в C, когда вы используете указатели. Обычно я пишу такой код, представляя матрицу в виде типа
int**
. Значение x
типа int**
является указателем на указатель на значение. Вы можете написать x[2][3]
, чтобы получить значение 2-й строки / 3-го столбца матрицы, и аналогичным образом назначить, используя x[1][0] = 5
(например).
Поэтому я бы поменял в начале объявления так:
int mul(int** a, int** b);
int i,j,k,**c,**a,**b;
Тогда я бы написал функцию для выделения матрицы 3x3.
int** alloc_matrix(int rows, int cols)
int** matrix = (int**)malloc(sizeof(int*)*rows);
for(int i = 0; i < rows; i++) {
matrix[i] = (int*)malloc(sizeof(int)*cols);
}
return matrix;
}
Тогда ваша основная функция выглядит как
int main() {
a = alloc_matrix(3,3);
b = alloc_matrix(3,3);
c = alloc_matrix(3,3);
...
Вам также нужно удалить оператор разыменования *
в нескольких местах, чтобы эта работа работала. Для тебя это домашнее задание: -)
Есть и другие способы сделать это, но это наиболее интуитивное решение, использующее указатели для меня. Вы также можете сделать это без указателей, просто статически выделяя a
, b
и c
как массивы 3x3.