我有一个大小为 5428x5428 的二维数组,它是一个对称数组。但是在编译时它给了我一个错误,说数组大小太大。谁能给我一个方法?

最佳答案

这个数组对于程序堆栈内存来说太大了 - 那是你的错误。

int main()
{
    double arr[5428][5428]; // 8bytes*5428*5428 = 224MB

    // ...
    // use arr[y][x]
    // ...

    // no memory freeing needed
}

使用动态数组分配:
int main()
{
    int i;
    double ** arr;

    arr = (double**)malloc(sizeof(double*)*5428);
    for (i = 0; i < 5428; i++)
        arr[i] = (double*)malloc(sizeof(double)*5428);

    // ...
    // use arr[y][x]
    // ...

    for (i = 0; i < 5428; i++)
        free(arr[i]);
    free(arr);
}

或者分配大小为 MxN 的普通数组并使用 ptr[y*width+x]
int main()
{
    double * arr;
    arr = (double*)malloc(sizeof(double)*5428*5428);

    // ...
    // use arr[y*5428 + x]
    // ...

    free(arr);
}

或使用组合方法:
int main()
{
    int i;
    double * arr[5428];  // sizeof(double*)*5428 = 20Kb of stack for x86
    for(i = 0; i < 5428; i++)
        arr[i] = (double)malloc(sizeof(double)*5428);

    // ...
    // use arr[y][x]
    // ...

    for(i = 0; i < 5428; i++)
        free(arr[i]);
}

关于c - 如何处理大型二维数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10249829/

10-12 20:47