如何修复初始化后'stack around variable was corrupted.'变量未更改为分配的值

How to fix 'stack around variable was corrupted.' Variables not changing to assigned value after initialization

本文关键字:变量 分配 variable 初始化 何修复 stack around was corrupted      更新时间:2023-10-16

所以我的合并排序代码工作了,然后在我尝试获取运行时时开始出现一些错误。现在,我得到"数组已损坏",我认为这是因为在初始化"left_bound"和"right_bound"后,即使我很确定我正确分配了它们,值也不会改变。所以它们是一些巨大的负数,超出了数组的范围,导致它被损坏(我认为(。

我尝试以我在谷歌上可以找到的各种可能的方式进行分配和初始化。

void merge(int arr[], int low_idx, int partition, int high_idx) {
int i, j, k, right_bound;
int left_bound (partition - low_idx + 1); 
right_bound = (high_idx - partition);
//temporary arrays
int* left_of_partition = NULL;
int* right_of_partition = NULL;
left_of_partition = new int[left_bound];
right_of_partition = new int[right_bound];
for (i = 0; i < left_bound; i++) {
left_of_partition[i] = arr[i + low_idx];
}
for (j = 0; j < right_bound; j++) {
right_of_partition[j] = arr[partition + 1 + j];
}
i = 0;
j = 0;
k = 1;
while (i < left_bound && j < right_bound) {
if (left_of_partition[i] < right_of_partition[j]) {
arr[k] = left_of_partition[i];
i++;
}
else {
arr[k] = right_of_partition[j];
j++;
}
k++;
}
while (i < left_bound) {
arr[k] = left_of_partition[i];
i++;
k++;
}
while (j < right_bound) {
arr[k] = right_of_partition[j];
j++;
k++;
}
delete[] left_of_partition;
delete[] right_of_partition;
left_of_partition = NULL;
right_of_partition = NULL;
}
void mergesort(int arr[], int low_idx, int high_idx)
{
if (high_idx > low_idx) {
int partition = (low_idx + high_idx) / 2;
mergesort(arr, low_idx, partition);
mergesort(arr, partition + 1, high_idx);
merge(arr, low_idx, partition, high_idx);
}
}
int main()
{
int v2[] = { 9,8,7,6,5,4,3,2,1,0 };
int max_idx = sizeof(v2) - 1;
mergesort(v2, 0, max_idx);
}

sizeof(v2)返回完整数组的内存大小 (= 10 * 4 = 40(。您必须使用sizeof(array) / sizeof(element)才能获得正确的数字。 当大小 = 40 时,您的代码正在写入 10 个元素的本地(堆栈数组(后面的内存,这会损坏堆栈:

int main()
{
int v2[] = { 9,8,7,6,5,4,3,2,1,0 };
int max_idx = sizeof(v2) / sizeof(int) - 1; // divide by sizeof(int)
mergesort(v2, 0, max_idx);
return 0;
}