Инициализация делает целое число из указателя без приведения - PullRequest
1 голос
/ 26 апреля 2020

Я пытаюсь определить структуру с указанными c параметрами, но мне интересно, есть ли лучший способ инициализировать структуру без использования выделения памяти .

Структура определения:

#define MAXLINE 1024
#define MAXNAME 256
#define MAXPATH 1024

typedef enum {
  BL_MESG         = 10

} mesg_kind_t;

// mesg_t: struct for messages between server/client
typedef struct {
  mesg_kind_t kind;               // kind of message
  char name[MAXNAME];             // name of sending client or subject of event
  char body[MAXLINE];             // body text, possibly empty depending on kind
} mesg_t;

typedef struct {
  char name[MAXPATH];
} client_t;

Как я создаю msg_t

mesg_t create_mesg(client_t *client, char *text){
  char * cl_name = client->name;
  mesg_t msg = {BL_MESG, "", ""};
  strcpy(msg.name, cl_name);
  strcpy(msg.body, text);
  return msg;
}

Есть ли способ инициализировать его без использования strcpy? Есть ли что-то очевидное, что я просто здесь полностью отсутствует?

1 Ответ

1 голос
/ 26 апреля 2020

Вы не можете сделать это таким образом. Вам нужно использовать что-то, что передается и копируется по значению. В C это может быть struct или union.

#define MAXLINE 1024
#define MAXNAME 256
#define MAXPATH 1024

typedef enum {
  BL_MESG         = 10
} mesg_kind_t;

struct names
{
    char name[MAXNAME];
};

struct bodys
{
    char body[MAXNAME];
};

typedef struct {
  char name[MAXPATH];
} client_t;



// mesg_t: struct for messages between server/client
typedef struct {
  mesg_kind_t kind;               // kind of message
  client_t name;             // name of sending client or subject of event
  struct bodys body;             // body text, possibly empty depending on kind
} mesg_t;

#define MAKENAME(str) (struct bodys){str}
#define MAKEBODY(str) (client_t){str}


mesg_t create_mesg(client_t *client, struct bodys text){

  mesg_t msg = {BL_MESG, *client, text};
  return msg;
}


void foo()
{
    create_mesg(&MAKEBODY("This is client"), MAKENAME("this is body"));
}

https://godbolt.org/z/d83USr

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...