我正在编写一个简单的游戏,我会在程序运行时跟踪他们在 session 中玩的每个游戏的用户统计信息。为此,我制作了一个名为“游戏”的结构,其中保存了所玩游戏的统计信息(游戏#、谁赢了、谁输了、轮数#,以及他们是否选择退出)。然后我制作了这些结构的动态数组,每当玩的游戏数量增加一个时,它就会为一个新结构分配更多的内存部分。然后通过运行一个 for 循环输出所有统计数据,该循环遍历并输出该 session 中玩过的每场比赛的统计数据。当输出包含游戏编号的 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);
这就是我每次玩新游戏时为新游戏结构扩展数组的方式。 Index 在每场比赛后增加 1,此代码应确保容量保持相同或大于 index。
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);
此游戏
包含一个名为std::string
的C++ 类。这是一个具有构造函数和析构函数的类。
malloc()
和 realloc
是 C 库函数,它们对任何 C++ 类一无所知,也不知道如何调用其构造函数或析构函数。
您不能对 C++ 类使用 malloc
、realloc
或 free
。不是 std::string
或任何其他非 POD C++ 类。
幸运的是,C++ 有一个非常有用的类,叫做 std::vector
,它可以正确地管理“动态数组”,正确地增长和收缩,并为其内容分配内存,并正确地构造和销毁需要 build 或销毁的一切。
您的代码重新发明了一个已经发明的轮子,称为 std::vector
。它会手动完成显示的代码所做的一切,包括大小、容量等...您正在尝试复制 std::vector
的逻辑,但没有任何明显的好处。
完全摆脱所有使用malloc
、realloc
和free
的代码,并将其替换为std::vector
。您将在 C++ 书籍中找到有关如何使用 std::vector
的更多信息。
关于c++ - 访问动态数组中的结构中的字符串变量时如何修复 "segmentation fault (core dumped)"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57838750/