在C中定义数组时,数组尺寸太大?

时间:2016-03-19 06:32:08

标签: c

我试图计算地图中〜1000点之间每两点之间的距离。在定义距离数组d [1000] [1000]时,我得到错误“code :: blocks已经停止工作”。

代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(){

    double d[1000][1000];
    //...
    return 0;
}

我正在使用64位PC并在Code :: Blocks中进行编码。

1 个答案:

答案 0 :(得分:5)

你的堆栈可能正在溢出。这是创建一个8兆字节的数组。使其全球化可能会解决您的问题。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

double d[1000][1000];

int main(){

...
return 0;
}

编辑:当然,你可以使用malloc和free。但是,由于这显然是一个初学者的问题,我避免使用它们。并且,因为数组是在main的顶部创建的,所以这个特定情况可以作为全局使用,因为根据定义它已经是单例。

这个(@ iharob)是我的回答:虽然我不喜欢另一个问题的答案,但问题又被关闭了。也许这应该是重复标记一个

如果你想使用2索引表示法,你需要使用malloc(),你需要创建一个与你的代码中的指针非常不同的指针数组。指针数组不会重复存储值,并且需要混淆分配释放代码,这反过来又会使管理错误变得非常困难。

根据您的需要,如果您需要飞机上的点,请执行此操作,因为它更干净,分配/解除分配更简单

struct Point 
{
    double x;
    double y;
};

struct Point *data;
data = malloc(1000 * sizeof(*data));
if (data == NULL)
    please_do_not_continue();
// Now you can access `data' like

data[0].x = 1;
data[0].y = 2;

如果你真的需要它是一个二维数组,你可以使用指针数组(如果你愿意的话,数组数组)模仿它

double **array;
array = malloc(1000 * sizeof(*array));
if (array == NULL)
    return handle_malloc_failure();
for (size_t i = 0 ; i < 1000 ; ++i)
{
    array[i] = malloc(1000 * sizeof(**array));
    // See how handling errors now is very complicated
    if (array[i] == NULL)
        free_allocated_elements_and_return?();
}

// ...

请记住,当你不再需要访问它时,你必须free()这个,那就是在第二种情况下循环thourgh每个指针,最后free()指针数组。而在第一种情况下只需free(data)