某些调用后,Malloc不起作用(C,使用gcc为Windows 10上的MinGW-W64编译)

时间:2019-06-06 01:10:22

标签: c windows gcc malloc mingw

我需要在Windows上测试项目的性能。
我有一个数组rede_conexoes的数组,并在循环中分配每个位置,但是经过一些迭代之后,malloc函数不起作用并突然停止了我的过程,甚至没有测试返回值和不会显示错误消息。

该代码在Windows 10的WSL(Linux的Windows子系统)上可以正常工作。为了在Windows上本地测试该代码,我为gcc编译器安装了Mingw-w64(找不到更好的解决方案,因为它支持需要OpenMP)。
这是带有malloc函数的代码段:

bool **rede_conexoes = (bool**) malloc(num_PL * sizeof(bool*));
...
for(int i = 0; i < num_PL; i++){
    rede_conexoes[i] = (bool*)malloc(num_PL*sizeof(bool)); // <- Error occurs here
    if(rede_conexoes[i] == NULL) exit(1); // <- Can't get to this line after the error
    for(int j = 0; j < num_PL; j++)
        fscanf(model, "%d", (int*)&rede_conexoes[i][j]);
}

我不知道如何在WSL上运行而没有任何问题,但是在Windows上它会崩溃并且没有错误消息。
我注意到,当num_PL大于2^3 = 8时,它开始失败,如果num_PL大于2^15 = 32768在Linux上没有问题。我在命令提示符(cmd)和PowerShell上测试了gcc创建的.exe,两者的结果相同。

2 个答案:

答案 0 :(得分:3)

当您将最后一个数字(当i == num_PL - 1j == num_PL - 1读入&rede_conexoes[i][j]时,您已经为bool(通常为1个字节)分配了空间,但是已要求运行时读取int(通常为4个字节,有时为8个字节)。这可能会在分配的空间末尾写入几个字节。这会导致“未定义的行为”,从而导致程序似乎无法正常工作,行为异常或崩溃。

取决于num_PL的值以及您的运行时如何处理内存管理,这些多余的字节可以覆盖运行时用来跟踪内存块的某些控制数据。根据被覆盖的内容及其使用方式,这可能会导致崩溃。

如评论中所述,一种解决方案是将整数读入类型为int的局部变量,然后将其分配给bool数组。

答案 1 :(得分:0)

也许,操作系统不允许调用过程为您提供所有内存。

假设您正在使用二次二维(2D)数组:

2^15 * 2^15 = 32.768 * 32.768 = 1.073.741.824 booleans!

如果您在32位体系结构sizeof(bool*) = 4中运行此代码:

1.073.741.824 * 4 = 4.294.967.296 (4GB)

如果您在64位体系结构sizeof(bool*) = 8中运行此代码:

1.073.741.824 * 8 = 8.589.934.592 (8GB)

所有这些内存都可用于调用过程?