我正在尝试下面的程序,并得到堆损坏,这是预期的。以下为守则:
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]
temp[0]时一切都应该很好--堆损坏不会发生在第7244行本身,在第7244行中,我将B[j]分配给temp[k],k超过了temp[0]是堆损坏的间歇性破坏。我在开始的时候打了4-5次堆损坏,但现在不打了?。
发布于 2020-02-24 05:21:00
写入数组的边界始终是未定义的行为。话虽如此,当你造成不明确的行为时,没有什么不好的事情会发生。堆损坏只可能发生,因为它是否发生取决于相对于组成堆的数据结构分配临时时间的位置。
尽管如此,当堆损坏发生时,它会发生在您指定的行中,即temp[k] = B[j]。在尝试使用temp打印出堆之前,程序不会注意到堆已经损坏,而导致堆损坏的原因只有在尝试执行涉及堆的操作(例如分配或删除)时才会被“注意到”。作为打印出cout << temp[i] << '", "的过程的一部分,temp[i]很可能会在外壳下进行分配或删除,这就是造成崩溃的原因。
https://stackoverflow.com/questions/60369647
复制相似问题