如何修复访问动态数组中结构中的字符串变量时"segmentation fault (core dumped)"错误

How to fix "segmentation fault (core dumped)" error when accessing a string variable within a struct within a dynamic array

本文关键字:segmentation fault core 错误 dumped 变量 动态 访问 何修复 数组 结构      更新时间:2023-10-16

我正在编写一个简单的游戏,我正在跟踪用户在程序运行时在会话中玩的每个游戏的统计数据。为此,我创建了一个名为"game"的结构,其中包含所玩游戏的统计信息(游戏#,谁赢了,谁输了,回合#,以及他们是否选择辞职(。然后,我制作了这些结构的动态数组,每次玩的游戏数量增加一个时,它就会为新结构再分配一段内存。然后通过运行一个 for 循环输出所有统计信息,该循环遍历并输出该会话中每场比赛的统计信息。当输出保存游戏编号的 int 变量时,没有问题,但是一旦它到达保存获胜者名称的字符串变量,我就会出现"分段错误(核心转储("错误。

我知道错误消息意味着我正在尝试访问我也无法访问的内存,所以我确保我的动态数组的容量大于索引,这样我就不会超出它的内存位置,甚至在每次游戏后都添加了额外的容量,但错误仍然存在。

我相信这部分是当我尝试访问"winner"字符串时导致错误的原因,只是不确定为什么:

for(int i = 0; i <= index; i++){
cout<<"Game "<<games[i].num<<"t|t"<<games[i].winner<<end;
}

这就是我制作动态数组的方式:

int index = 0;
int capacity = 1;
game *games;
games = (game *)malloc(sizeof(game)*capacity);

这就是每次玩新游戏时扩展新游戏结构的数组的方式。 索引在每次游戏后上升 1,此代码应确保容量保持相同或大于索引。

if (index>=capacity) {
capacity+=1;
games = (game *) realloc(games, sizeof(game)*capacity);
}

这是结构定义

struct game
{
int num;
string winner;
};

对于任何错误的格式,提前道歉,我是C++的菜鸟,我也是这个网站的新手。请善待:)

games = (game *)malloc(sizeof(game)*capacity);
games = (game *) realloc(games, sizeof(game)*capacity);

game包含一个名为std::string的C++类。这是一个具有构造函数和析构函数的类。

malloc()realloc是 C 库函数,它们对任何C++类或如何调用其构造函数或析构函数一无所知。

不能将mallocreallocfree与C++类一起使用。不是std::string,或任何其他非 POD C++类。

幸运的是,C++有一个非常有用的类,叫做std::vector,它将正确管理"动态数组",正确增长和收缩,为其内容分配内存,并正确构造和销毁需要构建或销毁的所有内容。

您的代码重新发明了一个已经发明的轮子,称为std::vector。它完成显示的代码手动执行的所有操作,包括大小、容量等......你试图复制std::vector的逻辑,没有任何明显的好处。

完全摆脱所有使用mallocreallocfree的代码,并将其替换为std::vector。您可以在C++书中找到有关如何使用std::vector的更多信息。

相关文章: