我怎样才能释放指向数组的指针?

时间:2018-04-12 14:28:32

标签: c arrays malloc

我正在做一些比较几种排序效率的作业。 我在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]);
    }
}

2 个答案:

答案 0 :(得分:2)

您超出数组范围,因为您arr[i]写入i9最多为int* arr[5],而数组则声明为employee。 也许还有其他问题,但对我来说这是最明显的问题。

答案 1 :(得分:0)

int* arr[5]给你5个指针(实际上,是一个包含5个指针的数组),但是你循环到9个。所以,arr[9](和,arr[5]及以后)是一个错误。

你必须先照顾好。

Additinally:

  1. 不要投射malloc()的结果。 malloc()无论如何都会返回一个void指针,因此无需投射。 This answer here是个人最喜欢的理由。看一看!
  2. void main()更改为int main()int main(void)The C standard suggests the same, see!
  3. 你打电话给malloc(),但是这段代码似乎假设它无论如何都会成功。你必须检查malloc()的retutn值,如果它是NULL,则处理错误。