C Segfaults和引用结构数组

C Segfaults和引用结构数组,c,arrays,struct,segmentation-fault,scanf,C,Arrays,Struct,Segmentation Fault,Scanf,我有一个项目,涉及创建一个文本游戏。我正在为每个玩家创建一个结构,并将他们放入一个数组中。然后,我尝试传入数据,然后通过指针将数组传递给其他函数,但是我不断地得到分段错误(尽管在奇怪的情况下工作正常)。我总结如下 #include <stdio.h> #include <stdlib.h> typedef struct { char name[9]; int cardsHeld; int hand[8]; } Player; void printNames

我有一个项目,涉及创建一个文本游戏。我正在为每个玩家创建一个结构,并将他们放入一个数组中。然后,我尝试传入数据,然后通过指针将数组传递给其他函数,但是我不断地得到分段错误(尽管在奇怪的情况下工作正常)。我总结如下

#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;
}
#包括
#包括
类型定义结构
{
字符名[9];
国际卡德谢尔德;
int-hand[8];
}玩家;
无效打印名(玩家**玩家阵列)
{
对于(int i=0;i<3;i++)
{
fprintf(标准输出,“%s\n”,播放器阵列[i]->名称);
}
}
void gamesetup()
{
整数计数;
fprintf(标准值,“有多少玩家将参与‘游戏’?(1-5)\n”);
fscanf(标准输入、%d、&count);
玩家**玩家阵列=(玩家**)马洛克(玩家数量*)*;
for(int i=0;i名称);
}
打印名称(playerArray);
}
int main(int argc,字符**argv)
{
游戏设置();
返回0;
}
我的问题是,

  • fscanf是否获取Player.name成员的地址?我弄不清楚->操作符是应该遵从结构成员的值,还是因为它在地址数组中

  • 我不知道为什么它有时有效,但其他的却不行。如果它有时能从根本上起作用,那就没问题了。malloc函数是否分配了不应该分配的内存,或者fscanf是否将数据放在了错误的位置

  • 多谢各位

    -编辑-


    更改了代码,使其在完整的程序中,似乎可以在没有seg故障的情况下工作。我认为我的问题源于没有在终止之前释放内存,这会在下次运行它时把它搞乱,而不是先编译。我仍然不知道为什么fscanf可以工作,因为在我看来,参数playerArray[I]->name返回的是值,而不是地址。

    我已经在困惑的地方找到了它。感谢您在评论中提供的帮助


    我在数组中访问的成员是一个字符字符串,因此第一个成员是指针。通过使用fscanf(stdin,“%s”,playerray[i]->name);这延迟了指针(地址),因此它可以工作。我弄糊涂了,因为它是一系列结构的成员。segfaults是由于我在尝试修复已起作用的代码时弄乱了代码造成的。

    我已经在困惑的地方解决了它。感谢您在评论中提供的帮助


    我在数组中访问的成员是一个字符字符串,因此第一个成员是指针。通过使用fscanf(stdin,“%s”,playerray[i]->name);这延迟了指针(地址),因此它可以工作。我弄糊涂了,因为它是一系列结构的成员。segfaults是由于我在尝试修复已起作用的代码时弄乱了代码造成的。

    您能将其写入一个完整的可编译程序(使用
    main()
    函数等)吗?将其最小化到问题仍然出现的程度。现在很难说问题出在这个片段或代码上,还是在它之外。另外,打开编译器警告,看看编译器是怎么说的。名称最多有8个字符?然后
    gameController(playerray)
    对我们来说仍然很神秘数组的“值”是它的第一个元素的地址。“我认为我的问题是在终止之前没有释放内存,这下一次会把它搞乱……”——你的想法是错误的,根本原因是在其他地方。你能把它写进一个完整的、可编译的程序(使用
    main()
    功能等)?将其最小化到问题仍然出现的程度。现在很难说问题出在这个片段或代码上,还是在它之外。另外,打开编译器警告,看看编译器是怎么说的。名称最多有8个字符?然后
    gameController(playerray)对我们来说仍然很神秘数组的“值”是它的第一个元素的地址。“我认为我的问题源于没有在终止之前释放内存,这会在下次把它搞乱…”你的想法是错误的,根本原因是其他地方。