【问题标题】:Segfaults and referencing struct arrays段错误和引用结构数组
【发布时间】: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;
}

我的问题是;

  1. fscanf 是否获取 Player.name 成员的地址?我很困惑 -> 运算符是应该尊重结构成员的值还是因为它在数组中的地址?

  2. 我不确定为什么它有时会起作用,但有时却不起作用。如果它有时从根本上起作用,那应该没问题。是 malloc 函数分配了它不应该分配的内存,还是 fscanf 将数据放在了错误的位置。

谢谢。

-编辑-

更改了代码,使其成为一个完整的程序,看起来可以正常工作而没有段错误。我认为我的问题是由于在终止之前没有释放内存而导致下次我在没有先编译的情况下运行它时搞砸了。我仍然不确定为什么 fscanf 在我的脑海中起作用,参数 playerArray[i]->name 返回的是值,而不是地址。

【问题讨论】:

  • 你能把它写成一个完整的、可编译的程序(带有main()函数等)吗?将其最小化到问题仍然出现的程度。现在很难判断问题出在这个 sn-p 或代码上,还是在它之外。另外,打开编译器警告,看看编译器说了什么。
  • 名称最多有 8 个字符?那么gameController(playerArray); 对我们来说仍然很神秘
  • 数组的“值”是它的第一个元素的地址。
  • "我认为我的问题是由于在终止之前没有释放内存导致下一次搞砸......" - 你的想法不正确,根本原因在其他地方。

标签: c arrays struct segmentation-fault scanf


【解决方案1】:

我已经解决了我感到困惑的地方。感谢您对 cme​​ts 的所有帮助。

我在数组中访问的成员是一个字符字符串,所以第一个成员是一个指针。通过使用 fscanf(stdin, "%s",playerArray[i]->name);这推迟了指针(地址),因此它可以工作。我陷入了混乱,因为它是结构数组的成员。段错误是由于我弄乱了代码以尝试修复已经起作用的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    • 2020-02-17
    相关资源
    最近更新 更多