C中的动态内存分配重复

时间:2016-04-30 09:02:08

标签: c arrays memory memory-management

我对C编程有些新意。我对动态内存分配有疑问。以下是主程序中用于内存分配的代码。

scp -i "key-pair-name.pem" somefile.txt ec2xxxx.us-west-2.compute.amazonaws.com:~

我想调用函数并在函数内的矩阵中创建元素。我是否再次在函数内部分配内存,如下所示,还是有任何其他方法可以避免这种繁琐的内存分配重复。以下是该功能。

double **mat=(double**)malloc(sizeof(double*)*n);
mat[0]=(double*)calloc(sizeof(double),n*n);
for(i=1; i<n; i++)
mat[i] = mat[i-1] + n;
mat = create_square_matrix(n);

` 上面的函数返回存储在'mat'变量中的数组。另一个问题是如何在使用return方法后释放函数内部变量'array2'的内存。在返回数组之前,我无法释放内存。有没有一种方法可以在上面的函数中释放内存。

3 个答案:

答案 0 :(得分:1)

你的函数create_square_matrix分配内存,然后用一些值填充它。

您的顶层代码分配内存,然后调用create_square_matrix再次分配内存。在打电话给那个也拖地板的看门人之前,就像拖地板一样。您不需要两次分配内存。不仅是不必要的,事实上它是不好的。由于您执行了两次分配,因此第一次的内存将丢失,并且无法释放它。这称为内存泄漏。而不是

double **mat=(double**)malloc(sizeof(double*)*n);
mat[0]=(double*)calloc(sizeof(double),n*n);
for(i=1; i<n; i++)
mat[i] = mat[i-1] + n;
mat = create_square_matrix(n);

你应该写

double **mat = create_square_matrix(n);

答案 1 :(得分:0)

如上所述,在C中,无需转换为 void * 。此外,您的calloc是向后的:第一个参数使用 N 元素,第二个参数使用 sizeof(元素)

我会回答你的问题,然后建议一个更好的方法。

您正在为矩阵选择double **。即使它不是正方形,你也确切知道你需要多少指针和多少双打,当然每种类型有多大。所以,

double **M = malloc( n * sizeof(double*) + n * m * sizeof(double) );

诀窍,不是吗?如果您的机器sizeof(double*) == sizeof(double)(可能是真的),那么

double **M = calloc( (1+n) * m, sizeof(double) );

也有效,但不太方便。你也可以免费得到零;如果double f=0产生一个所有位都为零的值,那么你很难找到一台机器。

但为什么要将矩阵定义为指针数组?为什么不把它定义为双打数组呢?

double *M = calloc( n * m, sizeof(double) );

更好的是,在过去15年左右的时间里,C支持可变长度数组,这意味着您可以定义大小在运行时确定的数组。回到K&amp; R天,您可以定义一个数组M[n],除非n是静态常量或枚举。如果你的数组不是巨大的 - 意味着对于有问题的机器它们可以很好地适应堆栈 - 你可以跳过malloc并简单地按运行时确定的大小来定义矩阵。

即使你不能这样做,也可以动态地输入一个维度,

typedef double (x_axis_t)[m];
double x_axis_t *M = calloc( n * sizeof(x_axis_t), sizeof(double) );

这很好,因为那样你就可以像

一样访问你的数组了
M[x][y];

只是不要尝试使用M[x,y],因为这完全不同。

顺便说一下,既然你是游戏的新手,要使用c99编译器,标准命令是 c99 ,而不是 cc 。有关详细信息,请参阅友好手册: - )

答案 2 :(得分:-1)

使用一个好的函数宏进行内存分配总是一个好主意。除非你必须手动释放内存,否则我会将它留给垃圾收集器,例如libgc。以下是一个例子。如果您不想使用垃圾收集器,只需将 GC_MALLOC 替换为 malloc 即可。当您释放阵列(手动)时,您必须先释放各个行。

#include <gc/gc.h>
#include <stdio.h>
#include <stdlib.h>

#define NEW_ARRAY(ptr, n) (ptr) = GC_MALLOC((n) * sizeof (ptr)[0])

double **SquareMatrix(int n)
{
    double **A;
    int i, j;

    NEW_ARRAY(A, n);
    for (i = 0; i < n; i++) {
        NEW_ARRAY(A[i], n);
        for (j = 0; j < n; j++) {
            A[i][j] = 0.0;
        }
    }
    return A;
}


int main(void)
{
    const int n = 5;
    double **A;
    int i, j;

    A = SquareMatrix(n);    
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            printf("%5.2f ", A[i][j]);
        }
        putchar('\n');
    }

    return 0;
}