У меня есть статический указательБесплатный 2d массив. Статический указатель
static int **2dArr;
, а затем я выделить память для 2d массива. Как я могу освободить эту память и заменить ее другим массивом?
//////////////////////////////////////////////////////////////////////////
void func(int **arr) {
int i,j,k,tmp;
int **destMatrix = NULL;
destMatrix = (int**) malloc(N * sizeof(int *));
if ((destMatrix == NULL)) {
fprintf(stderr, "out of memory\n");
exit(2);
}
for (i = 0; i < N; i++) {
destMatrix[i] = (int*) malloc(N * sizeof(int));
if (destMatrix[i] == NULL) {
fprintf(stderr, "out of memory\n");
exit(2);
}
}
for(i = 0; i < N; ++i) {
free(arr[i]);
}
free(arr);
arr = NULL;
arr = destMatrix;
}
//////////////////////////////////////////////////////////////////////////
int main() {
2dArr = (int**) malloc(N * sizeof(int *));
if (2dArr== NULL) {
fprintf(stderr, "out of memory\n");
exit(2);
}
for (i = 0; i < N; i++) {
2dArr[i] = (int*) malloc(N * sizeof(int));
if (2dArr[i] == NULL) {
fprintf(stderr, "out of memory\n");
exit(2);
}
}
func(2dArr);
// try to print new array, access violation
}
Я освобождаю память и пытаюсь заменить указатель. Но тогда у меня есть нарушение прав доступа. Как я могу сделать это правильно?
Перебора и бесплатно каждый указатель во втором измерении, а затем освободить главный указателю –
«I свободной памяти и попытаться заменить указатель» - вы освободить память, но вы * Не заменяйте указатель. Вы заменяете его только копию (переменная 'arr' в' func'). Исходный указатель (как бы он ни назывался, он не может быть «2dArr», это не настоящий идентификатор) остается неизменным и указывает на освобожденную память. –