【问题标题】:How To Fix Stack Corruptions Caused By Generating Random Enumeration Values?如何修复由生成随机枚举值导致的堆栈损坏?
【发布时间】:2015-11-04 10:36:13
【问题描述】:

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

出于测试目的,我使用 Hearthstone(流行的 CCG)中的不同卡牌的名称创建了一个枚举。

enum cardnames {ArcaneExplosion, ArcaneIntellect, ArcaneMissiles};

然后我创建了一个名为“玩家卡”的枚举对象数组(其中 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;

但是,这导致了堆栈损坏错误,我对内存的工作原理不是很了解。有人可以帮我修复这个错误吗?

【问题讨论】:

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


    【解决方案1】:

    您的数组是一个值太小。你声明:

    cardnames playercards[2];
    

    但后来你写信给playercards[2]

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

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

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

    【讨论】:

    • 非常感谢!我从来不知道,我很快就会将此标记为答案。
    • 哇,您似乎很喜欢大写单词...无论如何,不​​用担心。我还应该指出,当您使用 rand() % 2 时,它将返回 0 或 1 的值。我认为在这种情况下您需要 rand() % 3
    • 感谢您的帮助。我会在控制下获得我的大写习惯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    相关资源
    最近更新 更多