MPI中的c指针

1 c mpi

我的mpi程序是这样的:

........
MPI_Status status1;

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

.....
Run Code Online (Sandbox Code Playgroud)

这个程序运行良好.但是当我改变它时:

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

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

.....
Run Code Online (Sandbox Code Playgroud)

它运行不好并出错:

erro: Segmentation fault (signal 11)
Run Code Online (Sandbox Code Playgroud)

&status1相等status2

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

mer*_*011 5

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

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

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

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

MPI_Status* status2 = malloc(sizeof(MPI_Status));
Run Code Online (Sandbox Code Playgroud)

当然,在你完成它之后,你应该负责并且free()记忆:

free(status2);
Run Code Online (Sandbox Code Playgroud)


use*_*031 5

在第一种情况下,status1是一个对象,&status1指向MPI_Recv可以写入的有效对象的指针也是如此.

在第二种情况下,status2是一个未初始化的指针.它的值可能是一些随机堆栈垃圾,所以当MPI_Recv尝试写入它时,它会写入一些随机内存位置.很多内存不喜欢被写入,所以你得到一个段错误.你也可能会得到一些微妙的内存损坏,以后会引起奇怪的问题.

如果你试试这个,它应该工作:

MPI_Status status1;
MPI_Status* status2 = &status1;

.......
MPI_Recv(rb,buf_size,MPI_INT,prcid,1,MPI_COMM_WORLD,status2);
Run Code Online (Sandbox Code Playgroud)