我写了一个使用double矩阵的C代码:
double y[LENGTH][4];
whith 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));
}
我运行上面的代码,经过一些计算后,它仍然给我&#34;分段错误&#34;。 有谁可以帮助我?
答案 0 :(得分:3)
如果您想要一个指定行宽的动态分配2D数组,请执行以下操作:
double (*y)[4] = malloc(LENGTH * sizeof(*y));
不需要malloc矩阵中的每一行。单个malloc
和free
就足够了。仅当您需要动态行宽(每行的宽度可以独立于其他行而变化)或列计数是任意的时,才应考虑嵌套的malloc循环。在这里似乎都不是你的情况。
注意:
malloc
in C programs free(y);
。答案 1 :(得分:1)
你的静态分配数组是一个具有一百万个元素的segfaulting的原因(推测)是因为它被分配在堆栈上。要让程序具有更大的堆栈,请将适当的开关传递给编译器。
ProTip :如果您翻转循环,分配
,您将体验更少的内存碎片和更好的性能 (double *)malloc(LENGTH * sizeof(double));
四次。这将需要更改索引的顺序。
我使用这个定义运行代码,经过一些计算后,它仍然给了我&#34; segmentatin fault&#34;
如果在分配内存后出现分段错误,则需要在内存范围之外进行编写。
答案 2 :(得分:0)
我运行此代码
#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;
}
它正常执行。
我从伪网站获得了code。
你不应该投出malloc
返回的内容。 Why?
另请注意,由于您需要仅针对行的数量进行动态分配,因为您知道列的数量。所以,你可以自己修改代码(这样你也有一些乐趣。:))
I hope you didn't forget to **free** your memory.