【发布时间】:2019-12-13 12:07:06
【问题描述】:
我正在使用 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++;
它似乎工作得很好。 我只是想知道为什么会这样。谁能指出我的错误以及为什么在第一个示例中给出了分段错误?
【问题讨论】:
-
您需要了解,在函数返回后,局部变量变得不可用,因此任何指向本地存储的指针都变得无效。
new_bullet和rectangle都是如此。因此,您认为“工作正常”的版本实际上并非如此,因为您的指针bullet_sprite设置为局部变量rectangle的地址,一旦函数返回,它就无效了。
标签: c pointers linked-list segmentation-fault nodes