C中的free()2D数组使用malloc

时间:2011-10-26 10:25:39

标签: c arrays matrix free

我想使用free()从内存中删除整个矩阵数组。我该怎么做?

分配数组:

// test.h
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

#define BYTE unsigned char
#define  my_array(n_height, n_width) (BYTE **)create_array(sizeof(BYTE), (n_height), (n_width))

char  **create_array(int u_size, int height, int width);
char  **create_array(int u_size, int height, int width)
{
    char  **array;
    int     i;

    if (!(array=(char **)malloc(height*sizeof(char *)))) {
        printf("Memory allocation error.\n");
        exit(0);
    }
    if (!(array[0]=(char *)malloc(height*width*u_size))) {
        printf("Memory allocation error.\n");
        exit(0);
    }
    for (i=1; i<height; i++)
        array[i] = array[i-1] + width*u_size;
    return array;
}

// test.c
#include "array.h"
int main()
{
    unsigned char *bytes;
    BYTE  **matrix;
    matrix = my_array(height, width);

    int c = 0;
    for (int h=0; h < height; h++) {
        for (int w=0; w < (width); w++) {
            matrix[h][w] = bytes[c];
            c++;
        }
    }

    printf("Done.\n");

    free(matrix); // really empty memory??
}

当我使用free(matrix)时,我不确定矩阵是否已完全从内存中删除;

4 个答案:

答案 0 :(得分:5)

每次致电free()时,您必须拨打malloc()一次。你不能“愚弄”free()免费:几个街区。如果您希望只能呼叫free()一次,则需要确保通过一次调用malloc()分配所有必需的内存。

答案 1 :(得分:2)

你有两个malloc,所以你需要两个free。但是如果你重新安排分配,你可以优化一下:

/...
void* mcontent;
if (!(mcontent = malloc(height*sizeof(char*) + height*width*u_size))) {
    printf("Memory allocation error.\n");
    exit(0);
}
array = (char **)mcontent;
array[0]=(char *)(mcontent + height*sizeof(char*));

这有两个好处。首先,可用性:你只需要释放你的矩阵“对象”,而不必费心如何制作它。第二,效率:你有地点和只有一个分配,这两者都意味着速度。

答案 2 :(得分:1)

如果您愿意,可以使用漂亮的C99指针到可变长度数组。

像这样分配:

char (*arr)[width] = emalloc(width*height);

像这样的指数:

arr[23][10] = 2; //row 23, column 10

像这样免费:

 free(arr);

答案 3 :(得分:0)

如果要检查内存是否已释放,则应使用Valgrind程序 见The Valgrind Quick Start Guide

在这种情况下,试试这个:

free(matrix[0]);
free(matrix);