【问题标题】:c pointer in MPIMPI 中的 c 指针
【发布时间】:2014-04-21 08:20:36
【问题描述】:

我的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);

.....

无法正常运行,报错:

erro: Segmentation fault (signal 11)

&status1 不等于 status2

它们之间有什么区别? 谢谢你 !

【问题讨论】:

  • 你初始化指针变量了吗?

标签: c mpi


【解决方案1】:

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

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

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

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

MPI_Status* status2 = malloc(sizeof(MPI_Status));

当然,做完之后,你应该负责和free()那段记忆:

free(status2);

【讨论】:

    【解决方案2】:

    在第一种情况下,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);
    

    【讨论】:

      猜你喜欢
      • 2013-04-22
      • 2019-01-17
      • 1970-01-01
      • 2011-11-12
      • 2020-07-18
      • 2013-11-18
      • 2021-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多