Вы не можете назначить указатель на строку на массив символов, как вы пытаетесь. Вместо этого вам нужно скопировать содержимое строки с помощью strncpy, как указал Адам:
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 FAQ "Массивы и указатели" - начните с Вопрос 6.2 и продолжайте читать оттуда.