В вашем примере x3
- это не char
- это указатель на char
. В большинстве случаев значения указателя имеют смысл только в том процессе, к которому они изначально принадлежали. Если вы отправляете значение указателя другому процессу через сокет, процесс получения обычно не может его использовать.
То, что вы, вероятно, хотите сделать вместо этого, это отправить массив char
(или, возможно, просто один char
, трудно сказать по вашему вопросу) - так что ваш struct
должен выглядеть следующим образом:
struct rcv {
int x1;
float x2;
char x3[LENGTH];
};
или, может быть:
struct rcv {
int x1;
float x2;
char x3;
};
(Если вы используете вторую форму, вам нужно будет использовать %c
вместо %s
в строке формата printf
).
В качестве дополнительной мысли вы должны иметь в виду, что если вы отправляете процесс, который не скомпилирован с помощью того же компилятора и нацеливается на ту же архитектуру, размер и расположение самого struct
, а также что из отдельных членов, вряд ли совпадать, и вы получите мусор.
В ответ на ваш вопрос в комментариях:
Вы должны использовать одно и то же определение struct
как для отправляющей, так и для принимающей стороны. Если у вас есть такая структура:
#define N 100
struct rcv {
int x1;
float x2;
char x3[N];
};
... и вы хотите вставить строку в элемент x3
, просто используйте strcpy
(или лучше, strncat
):
struct rcv data;
data.x3[0] = 0;
strncat(data.x3, some_string, N - 1);