我正在做一些比较几种排序效率的作业。 我在Visual Studio上编码。由于VS不允许使用可变大小的数组,我必须使用malloc()生成数组。
程序确实有效。但是,最后它会显示如下信息。
Debug Error!
Program:
_ergence\project\git\git_test\sort\Project1\Debug\Project1.exe
HEAP CORRUPTION DETECTED: after Normal block (#80) at 0x008FD038.
CRT detected that the application wrote to memory after end of heap buffer.
当我搜索时,sbd说“当你试图释放指向比它本身更大的指针时会发生这种情况”,但我不知道另一种解放它们的方法。
我知道如果我不释放它们,OS会取代它们。但是我在大学做作业,所以我必须检查一下。
这是我的源代码。抱歉我的英语不好。
#include <stdio.h>
int change = 0;
int compare = 0;
void main() {
int* arr[10];
for (int i = 0; i < 10; i++)
{
int size = (i + 1) * 1000;
arr[i] = (int *)malloc(size * sizeof(int));
}
for (int i = 0; i < 6; i++) {
switch (i) {
case 0:
printf("SelectionSort \n");
break;
case 1:
printf("BubbleSort \n");
break;
case 2:
printf("InsertionSort \n");
break;
case 3:
printf("ShellSort \n");
break;
case 4:
printf("MergeSort \n");
break;
case 5:
printf("QuickSort \n");
break;
}
for (int j = 0; j < 10; j++) {
int size = (j + 1) * 1000;
arraySetup(arr[j], size);
switch (i) {
case 0:
selectionSort(arr[j], size);
break;
case 1:
bubbleSort(arr[j], size);
break;
case 2:
insertionSort(arr[j], size);
break;
case 3:
shellSort(arr[j], size);
break;
case 4:
mergeSort(arr[j], 0, size - 1);
break;
case 5:
quickSort(arr[j], 0, size - 1);
break;
}
printf("size=%d ", size);
printf("compare = %d move = %d\n", compare, change);
compare = 0; change = 0;
}
printf("\n");
}
for(int i = 0; i < 10; i++) {
free(arr[i]);
}
}
答案 0 :(得分:2)
您超出数组范围,因为您arr[i]
写入i
,9
最多为int* arr[5]
,而数组则声明为employee
。
也许还有其他问题,但对我来说这是最明显的问题。
答案 1 :(得分:0)
int* arr[5]
给你5个指针(实际上,是一个包含5个指针的数组),但是你循环到9个。所以,arr[9]
(和,arr[5]
及以后)是一个错误。
你必须先照顾好。
Additinally:
malloc()
的结果。 malloc()
无论如何都会返回一个void指针,因此无需投射。 This answer here是个人最喜欢的理由。看一看!void main()
更改为int main()
或int main(void)
。 The C standard suggests the same, see!。malloc()
,但是这段代码似乎假设它无论如何都会成功。你必须检查malloc()
的retutn值,如果它是NULL,则处理错误。