【发布时间】:2017-02-26 21:37:58
【问题描述】:
我正在尝试用 C 编写一个简单的游戏,但我得到了一个 SEGFAULT,但不知道为什么!
这是程序的代码:
#include <stdio.h>
#include <string.h>
#define MAX_PLYS_PER_GAME (1024)
#define MAX_LEN (100)
typedef struct {
char positionHistory[MAX_PLYS_PER_GAME][MAX_LEN];
} Game;
void getInitialGame(Game * game) {
memset(game->positionHistory, 0, MAX_PLYS_PER_GAME*MAX_LEN*sizeof(char));
}
void printGame(Game game) {
printf("Game -> %p (%d)\n", &game, sizeof(game));
fflush(stdout);
}
int hasGameEnded(Game game) {
printGame(game);
return 0;
}
int main(int argc, char *argv[]) {
Game game;
getInitialGame(&game);
if (hasGameEnded(game))
return -1;
return 0;
}
我尝试使用 gdb 进行调试,但结果并没有让我走得太远:
C:\Users\test>gdb test.exe
GNU gdb 5.1.1 (mingw experimental)
<snip>
This GDB was configured as "mingw32"...
(gdb) run
Starting program: C:\Users\test/test.exe
Program received signal SIGSEGV, Segmentation fault.
0x00401368 in main (argc=1, argv=0x341c88) at fast-chess-bug.c:29
29 if (hasGameEnded(game))
(gdb) bt
#0 0x00401368 in main (argc=1, argv=0x341c88) at fast-chess-bug.c:29
【问题讨论】:
-
我无法复制它。对于高效的函数调用,printGame 和 hasGameEnded 应该采用指向游戏的指针(如 getInitialGame)。
-
您应该将
printGame()函数中的打印说明符从%d更改为%lu。 -
欢迎您!感谢您在您的问题中提供详细信息——不是每个人都这样做。查看tour 了解有关社区运作方式的更多信息,并享受您的逗留!
-
感谢您的反馈,伙计们!
-
好吧,你的程序编译和运行没有任何问题(只是一个关于使用
%d格式而不是%ld的警告sizeof(game)。除了按值传递完整结构的事实到hasGameEnded()和printGame()函数,我在你的代码中看不到任何不规则的东西(你在堆栈上复制一个100Kb 的结构以将它传递给任何一个函数)
标签: c struct segmentation-fault pass-by-value pass-by-pointer