[英]Allocate a matrix in C using malloc
我编写了一个使用double矩阵的C代码:
double y[LENGTH][4];
还有LENGTH=200000
我没有问题。
我必须将行数增加到LENGTH=1000000
但是当我输入此值并执行程序时,它将返回分段错误。
我试图使用malloc
分配更多的内存:
double **y = (double **)malloc(LENGTH * sizeof(double*));
for(int i = 0; i < LENGTH; i++){
y[i] = (double *)malloc(4 * sizeof(double));
}
我运行了上面的代码,经过一秒钟的计算后,它仍然给我“分段错误”。 有人可以帮我吗?
如果要动态分配具有指定行宽的2D数组,请执行以下操作:
double (*y)[4] = malloc(LENGTH * sizeof(*y));
无需malloc分配矩阵中的每一行。 单个malloc
和free
就足够了。 仅当您需要动态行宽度(每行的宽度可以独立于其他行而变化)或列数是任意的时,才应考虑使用嵌套的malloc循环。 这里似乎都不是您的情况。
笔记:
malloc
free(y);
当完成这个小幽会。 静态分配的数组使用一百万个元素进行段错误的原因(大概是),因为它是在堆栈上分配的。 要使程序具有更大的堆栈,请将适当的开关传递给编译器。
ProTip :如果您将循环翻转,分配,将减少内存碎片并获得更好的性能
(double *)malloc(LENGTH * sizeof(double));
四次。 这将需要更改索引的顺序。
我使用此定义运行了代码,经过一秒钟的计算,它仍然给我“ segmentatin错误”
如果分配内存后遇到分段错误,则说明您的写操作超出了内存范围。
我运行这段代码
#include <stdio.h>
#include <stdlib.h>
// We return the pointer
int **get(int N, int M) /* Allocate the array */
{
/* Check if allocation succeeded. (check for NULL pointer) */
int i, **table;
table = malloc(N*sizeof(int *));
for(i = 0 ; i < N ; i++)
table[i] = malloc( M*sizeof(int) );
return table;
}
void free2Darray(int** p, int N) {
int i;
for(i = 0 ; i < N ; i++)
free(p[i]);
free(p);
}
int main(void)
{
const int LENGTH = 1000000;
int **p;
p = get(LENGTH, 4);
printf("ok\n");
free2Darray(p ,LENGTH);
printf("exiting ok\n");
return 0;
}
并且它正常执行。
我从伪站点获取了代码 。
您不应该转换malloc
返回的内容。 为什么?
还要注意,由于您只需要对行数进行动态分配,因为您知道列数 。 因此,您可以自己修改代码(这样也可以带来一些乐趣。:))
I hope you didn't forget to **free** your memory.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.