C中的自由动态二维矩阵
Free dynamic bidimensional matrix in C
我编写了一个代码,它分配了 2 个 int
矩阵,并在使用后最后释放。当我取消分配第一个矩阵时,它工作正常。第二,错误:
munmap_chunk(): invalid pointer: 0x0829a068 ***Abortado (imagem do núcleo gravada)
找不到哪里出错了
#include <stdio.h>
#include <stdlib.h>
int **AlocaMatriz (int linha, int coluna) {
int **m, i, j;
m = (int **) malloc (linha * sizeof(int *));
for (i = 0; i < linha; i++) {
m[i] = (int *) malloc (coluna * sizeof(int ));
}
/*inicializa matriz*/
for (i = 0; i < linha; i++) {
for (j = 0; j < coluna; j++) {
m[i][j] = 0;
}
}
return(m);
}
int **DesalocaMatriz (int linha, int coluna, int** m) {
int i;
for (i = 0; i < linha; i++) {
free (m[i]);
}
free (m);
return(NULL);
}
int main() {
int i, j, numLinhas, numColunas, numInstancias, **matriz, **somas, resultado = 0;
scanf("%d", &numInstancias);
while (numInstancias > 0) {
scanf("%d %d", &numLinhas, &numColunas);
matriz = AlocaMatriz(numLinhas, numColunas);
somas = AlocaMatriz(numLinhas, numColunas);
//some operations on both matrices
DesalocaMatriz(numLinhas, numColunas, matriz);
DesalocaMatriz(numLinhas, numColunas, somas);
numInstancias--;
}
return 0;
}
一旦你有了一个二维数组,你就有了一个指向指针的指针。为了释放分配给该数组的内存,您需要在第一个数组之前释放辅助数组。这样做...
int **array;
int size1 = sizeof(array)/sizeof(array[0]);
for(int i=0; i<size1; i++) {
free(array[i]);
}
free(array);
您还应该知道,一旦程序结束,所有分配的内存都会自动释放。
你可以通过这样做动态分配一个数组...
array = malloc(size1 * sizeof(int*));
for (int i = 0; i < size1; i++) {
array[i] = malloc(size2 * sizeof(int));
}
这应该给出一个可以像这样访问的数组...
array[0-size1][0-size2];
查看malloc的return是成功还是失败。
#include <stdio.h>
#include <stdlib.h>
int **AlocaMatriz (int linha, int coluna) {
int **m = NULL, i, j;
if ( ( m = malloc (linha * sizeof(int *))) != NULL) {//not NULL is success
for (i = 0; i < linha; i++) {
if ( ( m[i] = malloc (coluna * sizeof(int ))) == NULL) {//NULL is failure
while ( i) {//free allocated so far
i--;
free ( m[i]);
}
free ( m);
return NULL;
}
}
/*inicializa matriz*/
for (i = 0; i < linha; i++) {
for (j = 0; j < coluna; j++) {
m[i][j] = 0;
}
}
}
return(m);
}
int **DesalocaMatriz (int linha, int coluna, int** m) {
int i;
for (i = 0; i < linha; i++) {
free (m[i]);
}
free (m);
return(NULL);
}
int main() {
int i, j, numLinhas, numColunas, numInstancias, **matriz, **somas, resultado = 0;
scanf("%d", &numInstancias);
while (numInstancias > 0) {
scanf("%d %d", &numLinhas, &numColunas);
matriz = AlocaMatriz(numLinhas, numColunas);
somas = AlocaMatriz(numLinhas, numColunas);
//some operations on both matrix
if ( matriz) {//if not NULL
DesalocaMatriz(numLinhas, numColunas, matriz);
}
if ( somas) {//if not NULL
DesalocaMatriz(numLinhas, numColunas, somas);
}
numInstancias--;
}
return 0;
}
我编写了一个代码,它分配了 2 个 int
矩阵,并在使用后最后释放。当我取消分配第一个矩阵时,它工作正常。第二,错误:
munmap_chunk(): invalid pointer: 0x0829a068 ***Abortado (imagem do núcleo gravada)
找不到哪里出错了
#include <stdio.h>
#include <stdlib.h>
int **AlocaMatriz (int linha, int coluna) {
int **m, i, j;
m = (int **) malloc (linha * sizeof(int *));
for (i = 0; i < linha; i++) {
m[i] = (int *) malloc (coluna * sizeof(int ));
}
/*inicializa matriz*/
for (i = 0; i < linha; i++) {
for (j = 0; j < coluna; j++) {
m[i][j] = 0;
}
}
return(m);
}
int **DesalocaMatriz (int linha, int coluna, int** m) {
int i;
for (i = 0; i < linha; i++) {
free (m[i]);
}
free (m);
return(NULL);
}
int main() {
int i, j, numLinhas, numColunas, numInstancias, **matriz, **somas, resultado = 0;
scanf("%d", &numInstancias);
while (numInstancias > 0) {
scanf("%d %d", &numLinhas, &numColunas);
matriz = AlocaMatriz(numLinhas, numColunas);
somas = AlocaMatriz(numLinhas, numColunas);
//some operations on both matrices
DesalocaMatriz(numLinhas, numColunas, matriz);
DesalocaMatriz(numLinhas, numColunas, somas);
numInstancias--;
}
return 0;
}
一旦你有了一个二维数组,你就有了一个指向指针的指针。为了释放分配给该数组的内存,您需要在第一个数组之前释放辅助数组。这样做...
int **array;
int size1 = sizeof(array)/sizeof(array[0]);
for(int i=0; i<size1; i++) {
free(array[i]);
}
free(array);
您还应该知道,一旦程序结束,所有分配的内存都会自动释放。
你可以通过这样做动态分配一个数组...
array = malloc(size1 * sizeof(int*));
for (int i = 0; i < size1; i++) {
array[i] = malloc(size2 * sizeof(int));
}
这应该给出一个可以像这样访问的数组...
array[0-size1][0-size2];
查看malloc的return是成功还是失败。
#include <stdio.h>
#include <stdlib.h>
int **AlocaMatriz (int linha, int coluna) {
int **m = NULL, i, j;
if ( ( m = malloc (linha * sizeof(int *))) != NULL) {//not NULL is success
for (i = 0; i < linha; i++) {
if ( ( m[i] = malloc (coluna * sizeof(int ))) == NULL) {//NULL is failure
while ( i) {//free allocated so far
i--;
free ( m[i]);
}
free ( m);
return NULL;
}
}
/*inicializa matriz*/
for (i = 0; i < linha; i++) {
for (j = 0; j < coluna; j++) {
m[i][j] = 0;
}
}
}
return(m);
}
int **DesalocaMatriz (int linha, int coluna, int** m) {
int i;
for (i = 0; i < linha; i++) {
free (m[i]);
}
free (m);
return(NULL);
}
int main() {
int i, j, numLinhas, numColunas, numInstancias, **matriz, **somas, resultado = 0;
scanf("%d", &numInstancias);
while (numInstancias > 0) {
scanf("%d %d", &numLinhas, &numColunas);
matriz = AlocaMatriz(numLinhas, numColunas);
somas = AlocaMatriz(numLinhas, numColunas);
//some operations on both matrix
if ( matriz) {//if not NULL
DesalocaMatriz(numLinhas, numColunas, matriz);
}
if ( somas) {//if not NULL
DesalocaMatriz(numLinhas, numColunas, somas);
}
numInstancias--;
}
return 0;
}