2009-09-21 96 views
4

我有以下结构:传递char数组为结构构件

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

在功能下面我采取一个字符指针(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 - > ...”行

回答

7

你几乎肯定不希望只是如编译器指出的,将char *赋给char [] - 类型不兼容,语义不是你想象的。我假设你希望struct成员包含两个char *字符串的值 - 其中如果您想调用strncpy。

strncpy(target, source, max_chars); 
+0

假设我在代码中的其他位置确定char数组长度小于给定的8/30字节长度,我将如何直接分配它并不复制它? – 2009-09-21 15:38:56

+0

在这种情况下,您会在结构中使用char *,并将指针复制到其中。 char *只是指向某些包含字符的内存的指针。 char []是n个字符的固定长度存储分配。你不能以合理的方式在它们之间进行分配。 – 2009-09-21 15:43:03

+0

@Christian:确定长度与您是否分配或复制无关。你不能分配给C中的数组。该语言不允许。您必须决定是否希望新的hashItem包含传递给insertItem的字符串副本(在这种情况下,使用某种副本以及某种边界检查)或指向它的指针(在这种情况下,使用char *而不是结构中的char [])。 – 2009-09-21 15:55:45

0

您不能像指定的那样将指向字符串的指针指定给字符数组。相反,你需要将字符串的内容与函数strncpy复制亚当表示:

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

当你声明在它的字符数组的结构,你是里面的结构分配内存本身来存储给定的字符串长度。

当你传递一个指针到你的函数中时,你传递一个内存地址(一个整数),表示可以找到以null结尾的字符串。

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

虽然你可以在你的结构中使用指针,但是你需要非常小心,当你指定它们时,你告诉它们指向在你使用结构的时间内有效的东西。例如,这个代码是不好的,因为字符串传递给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并继续阅读。

+0

在此处插入关于strncpy的常见参数:如果传入的用户标识正好是8个字符,则此代码将导致存储的字符串不会被终止。这可能不是你想要的。 – 2009-09-21 15:58:05

0

您应昌你的

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

结构来分配一个字符指针的名字。在你定义的结构中 char name [30]只有30个字符。

+0

当然假设insertItem的调用者将确保名称字符串在hashItem对象的生命周期内保持有效。 – 2009-09-21 15:57:16