将char数组传递给struct成员

时间:2009-09-21 15:35:38

标签: c struct

我有以下结构:

struct hashItem {
    char userid[8];
    char name[30];
    struct hashItem *next;
};

在下面的函数中,我采用了一个我希望赋给结构的char指针(char数组)参数。

void insertItem(struct hashItem *htable[], char *userid, char *name)
{
    int hcode = hashCode(userid);
    struct hashItem *current = htable[hcode];

    struct hashItem *newItem = (struct hashItem*) malloc(sizeof(struct hashItem));
    newItem->userid = userid;
    newItem->name = name;
    [...]
}

相反,我收到以下错误:

hashtable.c: In function ‘insertItem’:
hashtable.c:62: error: incompatible types in assignment
hashtable.c:63: error: incompatible types in assignment

62行和63行是`newItem-> ...“行。

3 个答案:

答案 0 :(得分:7)

你几乎肯定不想只将char *分配给char [] - 正如编译器指出的那样,类型是不兼容的,语义不是你想象的。我假设您希望struct成员包含两个char *字符串的值 - 在这种情况下,您要调用strncpy。

strncpy(target, source, max_chars);

答案 1 :(得分:0)

您无法将字符串指针指定给字符数组,就像您尝试的那样。相反,您需要使用strncpy复制字符串的内容,如Adam所示:

strncpy (newItem->userid, userid, 8);

当声明结构中包含字符数组时,您将在结构本身内部分配内存以存储给定长度的字符串。

当您将指针传递给函数时,您将传递一个内存地址(一个整数),指示可以找到以空字符结尾的字符串的位置。

分配指向数组的指针没有意义。数组已经为它分配了内存 - 它不能被“指向”另一个位置。

虽然您可以在结构中使用指针,但您需要非常小心,在分配它们时,您要告诉他们指出在您使用结构的持续时间内有效的内容。例如,此代码很糟糕,因为insertItem返回后传递给fillStructure的字符串不再存在:

struct hashItem
{
   char * userid;
};

void insertItem (struct hashItem * item, char * userid)
{
   item->userid = userid;
}

void fillStructure (struct hashItem * item)
{
   const char string[] = "testing";
   insertItem (item, string);
}

int main(void)
{
   struct hashItem item;
   fillStructure (&item);
   /* item->userid is now a dangling pointer! */
}

更多信息,我建议您阅读C常见问题解答中的“数组和指针”一章 - 从Question 6.2开始,并继续阅读。

答案 2 :(得分:0)

你应该在

中改变你的结构
struct hashItem {
  char userid[8];
  char *name;
  struct hashItem *next;
};

指定名称的char指针。在您定义的结构中 char name [30]只有30个字符。