gpt4 book ai didi

c - Malloc 在一些调用后不工作(C,在 Windows 10 上用 gcc 为 MinGW-W64 编译)

转载 作者:可可西里 更新时间:2023-11-01 11:23:07 24 4
gpt4 key购买 nike

我需要测试我的项目在 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,结果相同。

最佳答案

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

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

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

关于c - Malloc 在一些调用后不工作(C,在 Windows 10 上用 gcc 为 MinGW-W64 编译),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56469806/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com