如何修复生成随机枚举值导致的堆栈损坏?

时间:2015-08-12 01:42:27

标签: c++ visual-c++ memory-management stack runtime-error

我正在使用Win32 API制作CCG(集体卡片游戏),但我遇到了错误。

我创建了一个枚举,其中包含来自 Hearthstone (A Popular CCG)的不同卡片的名称,用于测试目的。

enum cardnames {ArcaneExplosion, ArcaneIntellect, ArcaneMissiles};

然后我创建了一个名为“Player Cards”的枚举对象数组(其中3个)。

cardnames playercards[2];

然后我使用rand()函数将对象设置为随机枚举。

playercards[0] = cardnames(rand() % 2 + 0);
playercards[1] = cardnames(rand() % 2 + 0);
playercards[2] = cardnames(rand() % 2 + 0);

然后最后将枚举打印到控制台窗口。

cout << playercards[0] << endl;
cout << playercards[1] << endl;
cout << playercards[2] << endl;

但是,这导致了堆栈损坏错误,而且我对内存的工作方式知之甚少。有人可以帮我修复这个bug吗?

1 个答案:

答案 0 :(得分:3)

你的数组太小了。你声明了:

cardnames playercards[2];

但后来你写信给playercards[2]

playercards[2] = cardnames(rand() % 2 + 0);

这将具有未定义的行为,因为您在数组之后立即写入堆栈内存。谁知道哪些数据被删除了?

请记住,您可以使用的最大索引比数组大小少