gpt4 book ai didi

c - 如何正确地为 C 中的结构分配内存?

转载 作者:太空宇宙 更新时间:2023-11-04 07:48:28 25 4
gpt4 key购买 nike

我不知道如何在没有段错误的情况下为我的 C 程序中的结构分配内存。

typedef struct Player{
char *name, *surname;
int xp;
} Player;

typedef struct Team{
char *name;
Player *player;
} Team;

typedef struct List
{
Team *team;
struct List *next;
} List_Node;

我需要制作一个包含一系列球员的团队列表,但为了让我的程序不出现段错误,我需要 malloc 每个结构的每个成员。然后我必须释放每个结构的每个成员。这是一个相当大的项目,我遇到了堆损坏错误,我不知道我是否正确地初始化了我的结构。

指针在main中初始化。

List_Node *list_node = (List_Node*)malloc(sizeof(List_node));

和函数

void create_list_Node(List_Node *temp)
{
temp->team = malloc....
temp->team->name = malloc....
temp->team->player = malloc....
temp->team->player->name = malloc....
temp->team->player->surname = malloc....
temp->next = NULL;
}

以节点作为参数调用。

最佳答案

为了减少“分散在各处的许多内存块”(以及跟踪所有小块分配/释放位置的麻烦),您可以为多个事物分配一 block 内存(例如,结构加一个字符串)。例如:

typedef struct Player{
char *name, *surname;
int xp;
} Player;

typedef struct Team{
struct Team *next;
char *name;
Player *player;
} Team;

Player *createPlayer(char *name, char *surname, int xp) {
Player *newPlayer;
int len1, len2;

len1 = strlen(name);
len2 = strlen(surname);
newPlayer = malloc(sizeof(Player) + len1+1 + len2+1);
if(newPlayer != NULL) {
newPlayer->next = NULL;
newPlayer->name = (char *)newPlayer + sizeof(Player);
memcpy(newPlayer->name, name, len1+1);
newPlayer->surname = newPlayer->name + len1+1;
memcpy(newPlayer->surname, surname, len2+1);
plyer->xp = xp;
}
return newPlayer;
}

Team *createTeam(Player *player, char *name) {
Team *newTeam;
int len1;

len1 = strlen(name);
newTeam = malloc(sizeof(Team) + len1+1);
if(newTeam != NULL) {
newTeam->next = NULL;
newTeam->name = (char *)newTeam + sizeof(Team);
memcpy(newTeam->name, name, len1+1);
newTeam->player = player;
}
return newTeam;
}

这也意味着释放任何东西都很容易——例如您可以 free(player) 而无需弄乱各个字段。

注意:我去掉了 List_Node 并在 Team 结构中放置了一个 next 字段。这有助于提高迭代性能(并减少过多的 malloc/free)。要理解这一点,假设您要列出所有团队名称并执行如下操作:

    while(node != NULL) {
printf("name: %s\n", node->team->name)
node = node->next;
}

在这种情况下; CPU 在等待 node 从内存中获取时停止,然后在等待 node->team 从内存中获取时停止。现在想象一下:

    while(team != NULL) {
printf("name: %s\n", team->name)
team = team->next;
}

在这种情况下; CPU 停顿一次而不是两次,因此可以更快地遍历列表。

关于c - 如何正确地为 C 中的结构分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55439962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com