【发布时间】:2019-10-21 12:20:18
【问题描述】:
我需要在 Windows 上测试我的项目的性能。
我有一个数组数组rede_conexoes,并在循环中分配每个位置,但经过一些迭代后,malloc 函数不起作用并突然停止我的进程,然后我什至可以测试返回值并且没有显示错误消息.
代码在 Windows 10 上的 WSL(Linux 的 Windows 子系统)上运行良好。为了在 Windows 上本地测试代码,我为 gcc 编译器安装了 Mingw-w64(找不到更好的解决方案,因为支持需要 OpenMP)。
这是带有malloc 函数的sn-p:
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,结果都一样。
【问题讨论】:
-
文件有足够的数字吗?
-
顺便说一句,最好[不要强制转换 malloc 的结果] (stackoverflow.com/questions/605845/…)
-
fscanf(model, "%d", (int*)&rede_conexoes[i][j]);如果sizeof(bool) < sizeof(int)写入越界(在许多实现中都是如此),并且还可能创建陷阱表示。并且指针可能与int对齐不正确。您应该读入一个int变量,然后分配给数组位置 -
fscanf()严重损坏;你告诉它指向_Bool的指针是指向int的指针。你好未定义的行为。 -
另外,您应该发布minimal reproducible example,因为问题可能是程序中其他地方的堆损坏并且恰好出现在此时
标签: c windows gcc malloc mingw