我有以下结构:
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-> ...“行。
答案 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个字符。