我有一个结构播放器,用作链表。
我正在尝试初始化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);
}
答案 0 :(得分:0)
真正的问题和唯一可能的解释是您正在使用c++编译器进行编译。在c++中,没有void *
到其他指针类型的隐式转换,与c中的指针类型不同。
您可能已将文件命名为 something.cpp ,这会导致编译器认为这是c++代码并按原样编译,从而导致您在交。
其他建议,
如果要复制已分配了非常精确的空间的给定字节数,请按照这样做
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()
。
如果您要编写c代码,建议您不要投出void *
read this for more information。一些c程序员可能不同意,但他们中的大多数人认为最好不要施放。
不要重复自己。或者众所周知的DRY原则,在您的代码中创建函数create_player()
以填充struct
的实例似乎是合适的,您正在重复代码,但这并不好。