如何解决;malloc():内存损坏";在C语言中使用MPI

如何解决;malloc():内存损坏";在C语言中使用MPI,c,memory,malloc,mpi,corruption,C,Memory,Malloc,Mpi,Corruption,我在C中使用MPI,我有一个双精度数组,如下所述: 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

我在C中使用MPI,我有一个双精度数组,如下所述:

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
取消引用
x
,因此它获取值
x
指向(a
double
*x
为空,在C语言中,取消引用空指针是未定义的行为

(double*)malloc
返回double类型的指针(a
double*

所以你说的是双倍*
=
double
,因此崩溃了

将代码修改为
x=(double*)malloc(n*sizeof(double))
,因此现在
x
指向分配的内存区域,大小为
n*sizeof(double)


实际上,我很惊讶您的编译器没有警告您这一点。

尝试使用以下格式的malloc可能会有所帮助,
如果((*x=(double*)malloc(sizeof(double))==NULL){printf(“\n内存分配错误”)
,通过此操作,您将了解内存分配或程序是否存在问题,并尝试使用上述格式。

出于安全原因,您为什么要取消引用
x
?但这不是问题,因为如果我删除它,这是一样的。它很有用,因为它允许避免读取未分配的部分内存。请在您的问题中提供一些。尝试使用请至少显示函数原型和调用。我已经尝试过了,但在编译过程中返回“警告:来自不兼容指针类型[-Wincompatible指针类型]的赋值”。您可以将您的尝试添加到问题中吗?我猜您被“双指针”术语误导了。您可能已经理解了“pass
x
的类型为
double*
”,而OP可能表示“pass
&x
的类型为
double**
”。无论如何,这就是为什么OP应该总是发布a,而不是用简单的英语讨论所做的事情。我刚刚尝试过,但控制台打印出相同的错误。尝试这两个
1.x=(int*)malloc(sizeof(double)*n)
其中n是您想要的双倍数
2.x=calloc(n,sizeof(double))