【问题标题】:Allocate a matrix in C using malloc使用 malloc 在 C 中分配矩阵
【发布时间】:2014-07-06 08:47:13
【问题描述】:

我编写了一个使用双精度矩阵的 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));
}

我运行上面的代码,经过几秒钟的计算,它仍然给我“分段错误”。 谁能帮帮我?

【问题讨论】:

标签: c arrays matrix double malloc


【解决方案1】:

如果你想要一个动态分配的指定行宽的二维数组,只需这样做:

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

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

注意事项:

【讨论】:

  • 我希望喜欢知道对此投反对票的原因。培养一对并大声说出来。
【解决方案2】:

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

专业提示:如果您翻转循环,分配内存,您将体验到更少的内存碎片和更好的性能

    (double *)malloc(LENGTH * sizeof(double));

四次。这将需要更改索引的顺序。

我用这个定义运行了代码,经过几秒钟的计算,它仍然给我“分段错误”

如果您在分配内存后遇到分段错误,则说明您的写入超出了内存范围。

【讨论】:

  • 谢谢,“适当的开关”是什么意思?
  • 这取决于您的特定编译器,并将在编译器的文档中进行介绍。
【解决方案3】:

我运行这段代码

#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.

【讨论】:

    猜你喜欢
    • 2014-01-17
    • 1970-01-01
    • 2011-01-08
    • 2013-04-06
    • 2015-10-13
    • 2023-03-03
    • 2013-05-21
    相关资源
    最近更新 更多