【发布时间】:2019-01-15 20:59:03
【问题描述】:
当我想在 C 编程语言中访问或修改结构成员的值时,会出现 segmentation fault。
我其实用C语言写了一个战舰联网游戏(这是一个学生项目)。我有一个名为Player的结构:
enum state{PLAYING = 0, WINNER = 1, LOOSER = 2};
enum action{ATTACK = 1, WAIT = 0, NOTHING = -1};
typedef struct Player Player;
struct Player
{
enum action action;
enum state state;
char name[25];
int isFirstPlayer;
Client* client;
Server* server;
Boards* boards;
};
主要功能。
int main(int argc, char *argv[])
{
if(argc < 2)
{
errorUsage();
}
// Initialise player
Player player = newPlayer();
// I removed the network initialization here.
// play game
play_game(&player);
}
segmentation fault 出现在函数play_game(Player* p) 中:
void attack(Player* p)
{
char msg[2];
bzero(msg, strlen(msg));
printf("Where do you want to fire?");
scanf("%s", msg);
while(verifyEntryAttack(msg) != 1)
{
printf("ERROR Entry:\nFormat = A4, C9, ...\nColumns = A B C D E F G H I J\nRows = 0 1 2 3 4 5 6 7 8 9\n");
printf("please try again: ");
scanf("%s", msg);
}
sendData(p, msg);
Box my_attack_box;
my_attack_box.abs = msg[0];
my_attack_box.ord = msg[1]-'0';
updateMarkBoard(p, my_attack_box);
}
void receiveAttack(Player* p)
{
char received_attack[2];
receiveData(p, received_attack);
printf("I have received the attack: %s\n", received_attack);
Box my_attack_box;
my_attack_box.abs = received_attack[0];
my_attack_box.ord = received_attack[1]-'0';
endureAttack(my_attack_box, p);
}
void play_game(Player* p)
{
while(p->state == PLAYING){
printPlayer(p); //print the game boards.
if(p->action == ATTACK){
printf("Your turn to attack.\n");
attack(p); //attack the ennemy
printf("end of attack turn.\n");
} else if(p->action == WAIT){
printf("wait for an attack...\n");
receiveAttack(p); //receive the attack from the ennemy.
printf("end of waiting turn.\n");
}
if(p->action == WAIT){
p->action = ATTACK;
}
else{
p->action = WAIT;
}
}
}
在 while 循环中转了一圈后,程序说“分段错误”。我的测试表明问题出在p->action。
请参阅下面显示问题的程序输出:outputs screenshot。
完整代码可在此处获得:GitLab repo link。
这就像我的程序无法访问我的播放器的action 成员。
有人有什么想法吗?
【问题讨论】:
-
attack()receiveAttack()printPlayer()和newPlayer()的来源是什么? seg 失败发生在哪 exactly 行?您甚至可以使用 printf.... 获取该信息。 -
顺便说一下,这是
LOSER,不是LOOSER。 -
请尝试创建一个minimal reproducible example 向我们展示,包括功能(或它们的简化版本,不要忘记
newPlayer)。也请尝试debug your program,至少尝试定位崩溃发生的时间和地点(并告诉我们)。最后请阅读how to ask good questions,以及this question checklist。 -
“我的测试表明这是 p->action”,这意味着 p 包含无效地址。查看 valgrind 以找到您的问题
-
当
p->action == NOTHING执行时:else{ p->action = WAIT;}那么struct是否为这种状态更改正确设置?
标签: c segmentation-fault