如何初始化结构

问题描述 投票:0回答:2

我不确定这是否是使用值创建和初始化结构的正确方法:

#define LINES 4
#define LENGHT 30

typedef struct
{
  char *name;
  char *phoneNumber;
  char *location;
  char *traveltype;
} Client;

void readClientData(char *filename, char *clientData[]);
Client *createClient(char *name, char *phoneNumber, char *location, char *traveltype);

int main(int argc, char *argv[])
{
  char *filename = argv[1];
  char *clientData = (char *)malloc(LINES * sizeof(char)*LENGHT);
  readClientData(filename, &clientData);
  Client *client = createClient(clientData[0], clientData[1], clientData[2], clientData[3]);
  return 0;
}

Client *createClient(char *name, char *phoneNumber, char *location, char *traveltype)
{
  Client *client = malloc(sizeof(Client));
  client->name = strdup(name);
  client->phoneNumber = strdup(phoneNumber);
  client->location = strdup(location);
  client->traveltype = strdup(traveltype);
  return client;
}

我正在尝试创建我的结构,但出现以下错误:

error: invalid conversion from 'char' to 'char*' [-fpermissive]
   Client *client = createClient(clientData[0], clientData[1], clientData[2], clientData[3]);

error: invalid conversion from 'void*' to 'Client*' [-fpermissive]
   Client *client = malloc(sizeof(Client));

我在这里想念什么?

c struct dynamic-arrays
2个回答
1
投票

由于clientDatachar *,所以clientData[i]是简单字符。这与createClient ()原型冲突,该原型期望指向以NULL终止的字符串的字符的指针。

请注意,在分配它们之后,您将永远不会对其进行初始化。这在运行时将是一个问题,因为strdup ()需要复制一些内容(至少是一个空字符串!)。

第二个错误要求您将malloc的结果强制转换为Client *(即使在很多情况下也可能会告诉您避免它,许多编译器都需要它。)>


1
投票

读取和创建操作可以合并。然后,在读取文件时,可以使用realloc增加客户端的数量。分配一个额外的结构以充当哨兵。或跟踪分配的结构数。对于每种结构,请尝试从文件中读取四行,然后将strdup行读取到结构指针。

© www.soinside.com 2019 - 2024. All rights reserved.