为什么我的C mpi程序中没有字符串



我想从0进程到1-6进程发送消息(问候语(,每次在消息后面加上数字I(G_str(,但结果显示

processor 1 received string:  from processor 0 
processor 2 received string:  from processor 0 
...

我不知道它没有显示我想发送的信息

#include <stdio.h>
#include <string.h>
#include <mpi.h>
int main(int argc, char *argv[])
{
int PID, P;
char greeting [] = "hello";
char replying [] ="nice to see you";
char G_str [10];
char R_str [10];
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &P);
MPI_Comm_rank(MPI_COMM_WORLD, &PID);
int len_g = strlen(greeting);
int len_r = strlen(replying);
int len_G = strlen(G_str); 
//send and receive//
if (PID == 0){
for (int i = 1; i <= 6; i++)
{   
sprintf(G_str, "%s%d", greeting,i);              
MPI_Send(&G_str, len_G, MPI_CHAR, i, 77, MPI_COMM_WORLD);
}
}
else{    
MPI_Recv(&G_str, len_G, MPI_CHAR, 0, 77, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
printf("processor %d received string %s from processor 0 n", PID, G_str);      
}
MPI_Finalize();
}

我想问题出在G_str的长度上,但如何纠正它?

char G_str [10];

G_str未初始化。您只需使用该语句声明char数组G_str,但不初始化字符串。

因此:

int len_G = strlen(G_str);

您将得到Undefined Behavior,因为strlen搜索以NUL结尾的字符串的字符,而G_str中显然不存在该字符。


更改:

char G_str [10];

至少:

char G_str [10] = "";

或者:

char G_str[10];
G_str[0] = 0;

初始化一个空字符串。

如果您希望在len_G中具有G_str的数组长度,则不应使用strlen,因为它只计算字符,直到找到字符串的终止字符,从而使和数组的其余部分(如果在之后还有其他char元素保留(不计数。相反,您应该使用sizeof运算符:

int len_G = sizeof(G_str);

以获得整个阵列CCD_ 15的容量。

最新更新