Может ли кто-нибудь мудрее, чем мне, объяснять мне, почему следующие ошибки сегмента кода? Нет проблем с распределением памяти по ссылке, но как только я попытаюсь присвоить что-либо или освободить по ссылке, произойдет segfault.Выделение и передача 2D динамических массивов по ссылке в C
Я уверен, что мне не хватает фундаментальной концепции о указателях и передачи по ссылке, надеюсь, что может быть потерян некоторый свет.
#include <stdlib.h>
#include <stdio.h>
void allocateMatrix(float ***);
void fillMatrix(float ***);
void freeMatrix(float **);
int main() {
float **matrix;
allocateMatrix(&matrix); // this function calls and returns OK
fillMatrix(&matrix); // this function will segfault
freeMatrix(matrix); // this function will segfault
exit(0);
}
void allocateMatrix(float ***m) {
int i;
m = malloc(2*sizeof(float*));
for (i = 0; i < 2; i++) {
m[i] = malloc(2*sizeof(float));
}
return;
}
void fillMatrix(float ***m) {
int i,j;
for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++) {
(*m)[i][j] = 1.0; // SEGFAULT
}
}
return;
}
void freeMatrix(float **m) {
int i;
for (i = 0; i < 2; i++) {
free(m[i]); // SEGFAULT
}
free(m);
return;
}
Я на самом деле немного удивлен, что компилируется. «void allocateMatrix (& m)», скорее всего, не набирает m как float **, как ожидалось. Кроме того, в C нет ссылок так же, как на C++. – Corbin
Почему подписи для 'freeMatrix' и т. Д. Разные при объявлении и определении? – keety
keety, Corbin: извините, скопируйте пасту, не удалось, исправлено – holocron