微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我的数组中的最后一个元素是一个我从未输入过的大数

如何解决我的数组中的最后一个元素是一个我从未输入过的大数

我将“掷骰子”的结果存储在一个数组中。 似乎一切正常,除了 Array 的最后一个值是 ╠ (-858993460)? 我尝试了故障排除,它在一开始就发生了,但我不知道为什么。

const int QDice = 3;
int Domain = 6 * QDice;
int CD[6 * QDice]{};
do
{
    cout << "Array CD[" << i << "] = " << CD[i] << "\n";
    i++;
} while (i <= Domain);

这产生:

Array CD[1] = 0
...
Array CD[18] = -858993460

一切都好接受最后一个元素。

解决方法

C++数组索引从0开始,所以数组CD[]的范围是1到17。当Domain变为18时,数组越界。建议您将代码修改为如下代码。

    do
    {
        cout << "Array CD[" << i << "] = " << CD[i] << "\n";
        i++;
    } while (i <= Domain - 1);
,

如评论和 another answer 中所述,您假设基于 1 的索引,而 C++ 数组使用基于 0 的索引。这意味着索引 18 越界,即它超出了数组的末尾。但是为什么会出现那个负数?

首先,当存在越界条件时,程序表现出未定义的行为。这意味着该程序实际上可以做任何事情,无论它是否符合您的意图。但是,在实践中,程序通常会假设数组对于所使用的索引来说足够大。因此,在您的情况下,它将查找索引 18 应该位于的内存(好像数组足够大),然后尝试将它在那里找到的字节解释为一些有意义的值。

现在,作为一般规则,内存可以具有任何值,除非您将其设置为特定值。通过初始化数组,您将每个数组元素的内存设置为一个确定值 (0)。但是刚刚超过数组末尾的是您尚未设置的内存,因此这些字节可以是任何内容。在您的情况下,它们的设置方式恰好是将它们解释为 -858993460,但这也可以是任何其他值。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。