【发布时间】:2023-03-14 00:53:01
【问题描述】:
我有一个涉及创建文本游戏的项目。我正在为每个玩家创建一个结构并将它们放入一个数组中。然后我尝试传入数据,然后通过指针将数组传递给其他函数,但是我不断遇到分段错误(尽管在奇怪的情况下工作正常)。我总结如下。
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
char name[9];
int cardsHeld;
int hand[8];
} Player;
void printNames(Player** playerArray)
{
for (int i = 0; i < 3; i++)
{
fprintf(stdout, "%s\n", playerArray[i]->name);
}
}
void gamesetup()
{
int count;
fprintf(stdout, "How many players will be partaking in 'The Game'? ( 1 - 5)\n");
fscanf(stdin, "%d", &count);
Player** playerArray = (Player**)malloc(sizeof(Player*) * count);
for(int i = 0; i < count; i++)
{
playerArray[i] = (Player*) malloc(sizeof(Player));
fprintf(stdout, "Please enter the name for player %d.\n\n", i + 1);
fscanf(stdin, "%s", playerArray[i]->name);
}
printNames(playerArray);
}
int main(int argc, char** argv)
{
gamesetup();
return 0;
}
我的问题是;
fscanf 是否获取 Player.name 成员的地址?我很困惑 -> 运算符是应该尊重结构成员的值还是因为它在数组中的地址?
我不确定为什么它有时会起作用,但有时却不起作用。如果它有时从根本上起作用,那应该没问题。是 malloc 函数分配了它不应该分配的内存,还是 fscanf 将数据放在了错误的位置。
谢谢。
-编辑-
更改了代码,使其成为一个完整的程序,看起来可以正常工作而没有段错误。我认为我的问题是由于在终止之前没有释放内存而导致下次我在没有先编译的情况下运行它时搞砸了。我仍然不确定为什么 fscanf 在我的脑海中起作用,参数 playerArray[i]->name 返回的是值,而不是地址。
【问题讨论】:
-
你能把它写成一个完整的、可编译的程序(带有
main()函数等)吗?将其最小化到问题仍然出现的程度。现在很难判断问题出在这个 sn-p 或代码上,还是在它之外。另外,打开编译器警告,看看编译器说了什么。 -
名称最多有 8 个字符?那么
gameController(playerArray);对我们来说仍然很神秘 -
数组的“值”是它的第一个元素的地址。
-
"我认为我的问题是由于在终止之前没有释放内存导致下一次搞砸......" - 你的想法不正确,根本原因在其他地方。
标签: c arrays struct segmentation-fault scanf