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

标签 c++ segmentation-fault c++14

我正在编写一个简单的游戏,我会在程序运行时跟踪他们在 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++ 类使用 mallocreallocfree。不是 std::string 或任何其他非 POD C++ 类。

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

您的代码重新发明了一个已经发明的轮子,称为 std::vector。它会手动完成显示的代码所做的一切,包括大小、容量等...您正在尝试复制 std::vector 的逻辑,但没有任何明显的好处。

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

关于c++ - 访问动态数组中的结构中的字符串变量时如何修复 "segmentation fault (core dumped)"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57838750/

相关文章:

c - 我的 strlen 代码出现段错误

c++ - 比较时出现段错误

c++ - bitset 是否保证连续性?

c++ - 具有特定条件的正则表达式

c++ - TCPSocket.h :35: error: expected ',' or '...' before numeric constant

c - 前序树遍历有效但后序无效

c++ - 为什么要在这里调用复制构造函数?

c++ - 处理条件编译的多个条件的最佳方法

c++ - 在 STL 容器中查找迭代器的索引 - 需要模板函数

c++ - unique_ptr 运行时错误