如何在C中将字符串初始化为链表结构

时间:2016-02-05 16:48:34

标签: c string struct linked-list

我有一个结构播放器,用作链表。

我正在尝试初始化Player的'name var'部分。我收到一条错误:无效转换为'void *'到'char *'。

我不明白为什么会发生这种情况,因为我有malloc内存然后只想复制字符串。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct Player
{
   char *name;
    int jersey;
    int points;
    struct Player* next;
};




int main()
{
    struct Player *head, *ptr;

    head = (struct Player*)malloc(sizeof(struct Player));

    char playerName[] = "Hurley";
    head->name=malloc(strlen(playerName)+1);

    strncpy(head->name, "Hurley");
    head->jersey = 11;
    head->points = 15;
    head->next = NULL;

    ptr = (struct Player*)malloc(sizeof(struct Player));

    char playerName2[] = "Hill";
    ptr->name=malloc(strlen(playerName2)+1);
    strncpy(ptr->name, "Hill");


    ptr->jersey =33;
    ptr->points = 17;
    ptr->next = NULL;

    head->next=ptr;
    printf("head name: %s, next name: %s\n", head->name, ptr->name);

    free(head);
    free(ptr);

}

1 个答案:

答案 0 :(得分:0)

真正的问题和唯一可能的解释是您正在使用编译器进行编译。在中,没有void *到其他指针类型的隐式转换,与中的指针类型不同。

您可能已将文件命名为 something.cpp ,这会导致编译器认为这是代码并按原样编译,从而导致您在交。

其他建议,

  1. 如果要复制已分配了非常精确的空间的给定字节数,请按照这样做

    const char *playerName = "Hurley";
    size_t length = strlen(playerName);
    
    player->name = malloc(length + 1);
    if (player->name != NULL)
        memcpy(player->name, playerName, length + 1);
    

    甚至比这更好,您可以使用strdup()代替。在使用NULL指针之前还必须检查player->name,因为当NULL出现问题时它会返回malloc()

  2. 如果您要编写代码,建议您不要投出void * read this for more information。一些程序员可能不同意,但他们中的大多数人认为最好不要施放。

  3. 不要重复自己。或者众所周知的DRY原则,在您的代码中创建函数create_player()以填充struct的实例似乎是合适的,您正在重复代码,但这并不好。