首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取int数组- C++的不一致堆损坏

获取int数组- C++的不一致堆损坏
EN

Stack Overflow用户
提问于 2020-02-24 04:39:39
回答 1查看 107关注 0票数 0

我正在尝试下面的程序,并得到堆损坏,这是预期的。以下为守则:

代码语言:javascript
复制
int main()
{
    int A[] = { 2,4,16,32,0,0,0,0 };
    int B[] = { 5,17,31,35 };
    int i = 0, j = 0,k=0;
    int length = sizeof(A) / sizeof(A[0]);
    int* temp = new int[length];
    while (k<length && A[k]!=0)
    {
        if (A[i] < B[j])
        {
            temp[k] = A[i];
            i++;
        }
        else
        {
            temp[k] = B[j];
            j++;
        }
        k++;
    }
    //copythe remaining items in A[] into temp.
    while (i < length && A[i] != 0)
    {
        temp[k] = A[i];
        i++; k++;
    }
    //copy the remaining items in B[] into temp.
    while (j < length)
    {
        temp[k] = B[j];
        j++; k++;
    }
    cout << "the sorted array is: ";
    for (int i = 0; i < length; i++)
    {
        cout << temp[i] << ", ";
    }
    return 0;
}

会发生堆损坏,因为我正在超出数组temp的范围。在我看来,堆损坏应该发生在第7244行,其中我将Bj分配给tempk (k超过length (即8) ),如下所示:

但是,堆损坏发生的时间很晚,在第7250行--我在这里尝试使用cout<<temp[0]。-

我有几个问题:

为什么堆损坏发生在试图读取temp[0]

  • Why时--因为在尝试读取temp[0]时一切都应该很好--堆损坏不会发生在第7244行本身,在第7244行中,我将B[j]分配给temp[k]k超过了temp[0]是堆损坏的间歇性破坏。我在开始的时候打了4-5次堆损坏,但现在不打了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-24 05:21:00

写入数组的边界始终是未定义的行为。话虽如此,当你造成不明确的行为时,没有什么不好的事情会发生。堆损坏只可能发生,因为它是否发生取决于相对于组成堆的数据结构分配临时时间的位置。

尽管如此,当堆损坏发生时,它会发生在您指定的行中,即temp[k] = B[j]。在尝试使用temp打印出堆之前,程序不会注意到堆已经损坏,而导致堆损坏的原因只有在尝试执行涉及堆的操作(例如分配或删除)时才会被“注意到”。作为打印出cout << temp[i] << '", "的过程的一部分,temp[i]很可能会在外壳下进行分配或删除,这就是造成崩溃的原因。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60369647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档