C 将字符数组传递给结构成员

C 将字符数组传递给结构成员,c,struct,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

我的结构如下:

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->…”行。

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

strncpy(target, source, max_chars);

您不能像尝试的那样将字符串指针分配给字符数组。相反,您需要使用strncpy复制字符串的内容,如下所示:

strncpy (newItem->userid, userid, 8);
当您声明包含字符数组的结构时,您是在结构本身内部分配内存来存储给定长度的字符串

当您将指针传递到函数中时,您正在传递一个内存地址(一个整数),该地址指示可以在何处找到以null结尾的字符串

将指针分配给数组是没有意义的。数组已经为其分配了内存——无法使其“指向”另一个位置

虽然您可以在结构中使用指针,但您需要非常小心,在分配指针时,您会告诉指针指向在您将使用该结构的时间内有效的内容。例如,此代码是错误的,因为传递给
插入项的字符串在
填充后不再存在structure
返回:

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 FAQ的“数组和指针”一章——从这里开始并继续阅读。

您应该在

struct hashItem {
  char userid[8];
  char *name;
  struct hashItem *next;
};
将字符指针指定给名称。在定义的结构中
char name[30]仅为30个字符。

假设我在代码中的其他地方确定char数组的长度小于给定的8/30字节,我如何直接分配它而不复制它?在这种情况下,您可以在结构中使用char*,只需复制指针。char*只是指向包含char的某个内存的指针。char[]是n个字符的固定长度存储分配。您不能以合理的方式在它们之间分配。@Christian:确保长度与您是分配还是复制无关。您永远不能在C中分配给数组。语言不允许。您必须决定是否希望新的哈希项包含s的副本传递给insertItem的字符串(在这种情况下,使用某种副本以及某种边界检查)或指向它的指针(在这种情况下,在结构中使用char*而不是char[])。当然,假设insertItem的调用方将保证名称字符串在hashItem对象的生存期内保持有效。请在此处插入关于strncpy的常用参数:如果传入的userid正好是8个字符,则此代码将导致存储的字符串未以nul结尾。这可能不是您想要的T