使用malloc在C中分配矩阵

时间:2014-05-18 08:31:57

标签: c arrays matrix double malloc

我写了一个使用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;。 有谁可以帮助我?

3 个答案:

答案 0 :(得分:3)

如果您想要一个指定行宽的动态分配2D数组,请执行以下操作:

double (*y)[4] = malloc(LENGTH * sizeof(*y));

不需要malloc矩阵中的每一行。单个mallocfree就足够了。仅当您需要动态行宽(每行的宽度可以独立于其他行而变化)或列计数是任意的时,才应考虑嵌套的malloc循环。在这里似乎都不是你的情况。

注意:

答案 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.