首页 > 解决方案 > Malloc 在某些调用后无法工作(C,在 Windows 10 上使用 gcc 为 MinGW-W64 编译)

问题描述

我需要在 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,如果大于在Linux2^3 = 8上没有问题。我在命令提示符(cmd)和 PowerShell 上测试了 gcc 创建的 .exe,结果都相同。num_PL2^15 = 32768

标签: cwindowsgccmallocmingw

解决方案


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

根据num_PL运行时处理内存管理的值和方式,这些额外的几个字节可能会覆盖运行时用来跟踪内存块的一些控制数据。根据被覆盖的内容和使用方式,这可能会导致您遇到崩溃。

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


推荐阅读