c - 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_PL
2^15 = 32768
解决方案
当您将最后一个数字(wheni == num_PL - 1
和j == num_PL - 1
)读入时&rede_conexoes[i][j]
,您已经为 a bool
(通常为 1 个字节)分配了空间,但您已要求运行时读取 an int
(通常为 4 个或有时为 8 个字节)。这可能会在您分配的空间末尾写入几个字节。这会导致未定义的行为,从而导致程序看起来正常工作、行为不端或崩溃。
根据num_PL
运行时处理内存管理的值和方式,这些额外的几个字节可能会覆盖运行时用来跟踪内存块的一些控制数据。根据被覆盖的内容和使用方式,这可能会导致您遇到崩溃。
正如评论中提到的,一种解决方案是将整数读入类型的局部变量int
,然后将其分配给您的bool
数组。
推荐阅读
- google-api - Google 的 OAuth 身份验证是免费的吗?
- node.js - JsonWebTokenError: jwt 必须是字符串
- python - 如何使用来自不同文件夹的 pytest 模块进行测试
- qt - QFileDialog - 如何设置过滤器以过滤掉包含特定字符串模式“系统”的文件?
- html - 如何以角度过滤JSON
- express - ExpressJS 文本/纯内容类型到 main.azkjnearjs
- mongodb - mongodb - 从非常大的集合(300M)中删除重复文档的超时
- regex - 正则表达式 (?i) 对所有值不区分大小写
- r - R 中的 PSO 包在需要 TRUE/FALSE 时总是以错误结束
- javascript - 使用 JavaScript 填充 CLOB 集合