繁体   English   中英

使用malloc在C中分配矩阵

[英]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分配矩阵中的每一行。 单个mallocfree就足够了。 仅当您需要动态行宽度(每行的宽度可以独立于其他行而变化)或列数是任意的时,才应考虑使用嵌套的malloc循环。 这里似乎都不是您的情况。

笔记:

静态分配的数组使用一百万个元素进行段错误的原因(大概是),因为它是在堆栈上分配的。 要使程序具有更大的堆栈,请将适当的开关传递给编译器。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM