gpt4 book ai didi

c - 为什么这段代码有效而另一段代码无效? (指针和链表)

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

我正在使用 SDL 用 C 语言开发一个简单的游戏,我需要制作一个链表来存储玩家可以射击的子弹。

我尝试了两件事:

typedef struct{
SDL_Rect *bullet_sprite; // sprite of the bullet
struct Bullet *next_bullet;
} Bullet;

Bullet bullets; // here I initialized bullets

在创建了一个名为 bullets 的对象(它将用于存储子弹)之后,我在这里创建了一个名为 shoot() 的空对象,它只是创建了另一个子弹并将其存储在 *next_bullet 中:

void shoot(Player *player){
Bullet new_bullet;
SDL_Rect rectangle = {player->x, player->y, BULLET_WIDTH, BULLET_HEIGHT};

new_bullet.bullet_sprite = &rectangle;
new_bullet.next_bullet = NULL;

if(!player->n_of_bullets){
bullets = new_bullet;
printf("first bullet\n");
}
else{
new_bullet.next_bullet = &bullets;
bullets = new_bullet;
printf("another bullet\n");
}

player->n_of_bullets++;
}

但是,当玩家射击时,会产生段错误。 (为什么?)

当我将代码更改为:

typedef struct{
SDL_Rect *bullet_sprite;
struct Bullet *next_bullet;
} Bullet;

Bullet *bullets = NULL;

shoot()到:

  Bullet *new_bullet = malloc(sizeof(Bullet));
SDL_Rect rectangle = {player->x, player->y, BULLET_WIDTH, BULLET_HEIGHT};

new_bullet->bullet_sprite = &rectangle;
new_bullet->next_bullet = NULL;

if(!player->n_of_bullets){
bullets = new_bullet;
printf("first bullet\n");
}
else{
new_bullet->next_bullet = bullets;
bullets = new_bullet;
printf("another bullet\n");
}

player->n_of_bullets++;

它似乎工作得很好。我只是想知道为什么会这样。有人可以指出我的错误以及为什么在第一个示例中给出了段错误吗?

最佳答案

shoot() 函数的第一个版本中,new_bullet 结构默认分配在 stack 内存中。这意味着当离开函数时,该内存部分将被释放并用于其他目的。我认为问题出在这里:您将 bullets 结构重新定位到 new_bullet 地址,该地址只能在该函数内部使用。

shoot() 的第二个版本是正确的,因为 malloc() 将在 内存中分配新变量,并且不会离开函数时释放。

顺便说一句,您可以在每次不再需要子弹时使用free()。因为现在你的程序会在你的炮手每次射击时在内存中分配一个新的结构,但永远不会释放它们。

希望对您有所帮助。

关于c - 为什么这段代码有效而另一段代码无效? (指针和链表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57367533/

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