MPI中的c指针

MPI中的c指针,c,mpi,C,Mpi,我喜欢这样的mpi程序: ........ MPI_Status status1; ....... MPI_Recv(rb,buf_size,MPI_INT,prcid,1,MPI_COMM_WORLD,&status1); ..... ........ MPI_Status* status2; ....... MPI_Recv(rb,buf_size,MPI_INT,prcid,1,MPI_COMM_WORLD,status2); ..... 这个程序运行得很好。 但当我这

我喜欢这样的mpi程序:

........
MPI_Status status1;

.......
MPI_Recv(rb,buf_size,MPI_INT,prcid,1,MPI_COMM_WORLD,&status1);

.....
........
MPI_Status* status2;

.......
MPI_Recv(rb,buf_size,MPI_INT,prcid,1,MPI_COMM_WORLD,status2);

.....
这个程序运行得很好。 但当我这样改变它时:

........
MPI_Status status1;

.......
MPI_Recv(rb,buf_size,MPI_INT,prcid,1,MPI_COMM_WORLD,&status1);

.....
........
MPI_Status* status2;

.......
MPI_Recv(rb,buf_size,MPI_INT,prcid,1,MPI_COMM_WORLD,status2);

.....
它无法正常运行并出现错误:

erro: Segmentation fault (signal 11)
&status1
不等于
status2

他们之间有什么区别?
谢谢大家!

不,它们不是等价的,尽管每次传递的参数肯定是相同的类型,这就是编译器没有抱怨的原因

在一种情况下,传递的是堆栈上已分配的结构的地址

在另一种情况下,您传递的指针指向内存中的某个任意(可能不可写)位置,因为它没有初始化

您可以使用
malloc
修复第二个调用,以分配内存并将指针指向它

MPI_Status* status2 = malloc(sizeof(MPI_Status));
当然,处理完之后,您应该负责并
释放()
内存:

free(status2);

不,它们不是等价的,尽管每次都传递相同的类型的参数,这就是编译器不会抱怨的原因

在一种情况下,传递的是堆栈上已分配的结构的地址

在另一种情况下,您传递的指针指向内存中的某个任意(可能不可写)位置,因为它没有初始化

您可以使用
malloc
修复第二个调用,以分配内存并将指针指向它

MPI_Status* status2 = malloc(sizeof(MPI_Status));
当然,处理完之后,您应该负责并
释放()
内存:

free(status2);

在第一种情况下,
status1
是一个对象,因此
&status1
是指向有效对象的指针,
MPI\u Recv
可以写入该对象

在第二种情况下,
status2
是未初始化的指针。它的值可能是一些随机堆栈垃圾,因此当
MPI_Recv
尝试写入它时,它会写入一些随机内存位置。很多内存都不喜欢被写入,因此会出现错误。您还可能会出现一些细微的内存损坏,这将在以后导致奇怪的问题

如果您尝试此方法,它应该可以工作:

MPI_Status status1;
MPI_Status* status2 = &status1;

.......
MPI_Recv(rb,buf_size,MPI_INT,prcid,1,MPI_COMM_WORLD,status2);

在第一种情况下,
status1
是一个对象,因此
&status1
是指向有效对象的指针,
MPI\u Recv
可以写入该对象

在第二种情况下,
status2
是未初始化的指针。它的值可能是一些随机堆栈垃圾,因此当
MPI_Recv
尝试写入它时,它会写入一些随机内存位置。很多内存都不喜欢被写入,因此会出现错误。您还可能会出现一些细微的内存损坏,这将在以后导致奇怪的问题

如果您尝试此方法,它应该可以工作:

MPI_Status status1;
MPI_Status* status2 = &status1;

.......
MPI_Recv(rb,buf_size,MPI_INT,prcid,1,MPI_COMM_WORLD,status2);

是否初始化指针变量?是否初始化指针变量?