我对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'的内存。在返回数组之前,我无法释放内存。有没有一种方法可以在上面的函数中释放内存。
答案 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]
,因为这完全不同。
答案 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;
}