c - 如何使用 MPI 解决 C 中的“malloc():内存损坏”
问题描述
我在 C 中使用 MPI,并且我有一个 double 数组,如下所示:
double *x = NULL;
我将此数组作为一个函数的双指针传递,并尝试以这种方式执行 malloc:
*x = (double*) malloc(n * sizeof(double));
其中n
是一个整数。编译没问题,但执行返回此错误:
malloc(): memory corruption
main: malloc.c:2401: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed.
===================================================================================
= BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
= PID 3842 RUNNING AT DESKTOP
= EXIT CODE: 134
= CLEANING UP REMAINING PROCESSES
= YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
===================================================================================
YOUR APPLICATION TERMINATED WITH THE EXIT STRING: Aborted (signal 6)
This typically refers to a problem with your application.
Please see the FAQ page for debugging suggestions
Makefile:22: recipe for target 'run' failed
make: *** [run] Error 134
可能是什么问题呢?我该如何解决?
解决方案
*x = (double*) malloc(n * sizeof(double));
*x
dereferences x
,因此它获取x
指向 (a double
) 的值。*x
是 NULL,在 C 中取消引用 NULL 指针是未定义的行为。
(double*) malloc
返回 double 类型的指针 (a double*
)
所以你说double *
== double
,因此崩溃。
将您的代码修改为x = (double*) malloc(n * sizeof(double));
,因此现在x
指向分配的内存区域,大小为n * sizeof(double)
实际上,我很惊讶你的编译器没有警告你。
推荐阅读
- java - 我不能在 onBingViewHolder 方法中使用 getRef,我正在尝试在另一个视图中显示所选项目
- qt - QT:实现QWidget的子类并生成dll时的问题
- python - 如何在 Python 中求解一个几乎是三对角矩阵?家庭作业
- c# - OnTriggerEnter2D 被未标记为触发器的碰撞器触发?
- http - 使用 Http 请求/cURL 在 Board 中创建项目
- node.js - 无法使用 `fetch-mock-jest 1.5.1` lib 模拟 fetch 调用
- angular - 以角度加载powerbi iframe
- azure-monitor - 将 Azure SQL 写入 Azure Monitor 或 Azure Dashboard 的日志?
- powershell - Neo4j with PowerShell 和 Neo4j as a service 有什么区别?
- javascript - 纱线控制台脚本中是否有 npm 变量(`npm_config_`)的类似物?