gpt4 book ai didi

c++ - 构造函数中的数组设置意味着稍后失败

转载 作者:可可西里 更新时间:2023-11-01 18:28:28 26 4
gpt4 key购买 nike

我遇到了一个问题,我的代码在尝试使用列表的 size() 函数时出现段错误。根据 stackoverflow 的建议 :-) 我构建了一个发生段错误的最小情况(在下面的调用 inventory.size() 中)。它是:

#include <list>

class Thing {};

class Player {
private:
int xpCalcArray[99];
std::list<Thing*> inventory;

public:
Player();

int addToInv(Thing& t); // return 1 on success, 0 on failure
};

Player::Player() {
// set up XP calculation array
for (int i=1; i<100; i++) {
if (i<=10) {
xpCalcArray[i] = i*100;
}
if (i>10 && i<=50) {
xpCalcArray[i] = i*1000;
}
if (i>50 && i<=99) {
xpCalcArray[i] = i*5000;
}
}
}

int Player::addToInv(Thing& t) {
if (inventory.size() == 52) {
return 0;
} else {
inventory.push_back(&t);
}
return 1;
}

int main(int argc, char *argv[]) {
Thing t;
Player pc;
pc.addToInv(t);
return 1;
}

我注意到当我删除 Player 构造函数中的数组设置时,它工作正常,所以这看起来是问题所在。我做错了什么?

最佳答案

您正在越界访问数组,这会导致未定义的行为。该数组的有效索引范围

int xpCalcArray[99];

是 0 到 98。您正在访问此处的索引 99:

if (i>50 && i<=99) {
xpCalcArray[i] = i*5000;
}

你的外循环应该是

for (int i=0; i<99; i++) { ... }

请注意,我从 0 开始,尽管这是假设您实际上想要访问第一个元素。

那么你的最终条件可以简化为

if (i>50) {
xpCalcArray[i] = i*5000;
}

如果您打算使用大小为 100 的数组,那么您需要

int xpCalcArray[100];

然后在 int i=0; i<100; 之间循环.

关于c++ - 构造函数中的数组设置意味着稍后失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15133520/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com