C和自由函数中整数数组的动态内存分配

时间:2014-08-02 03:45:14

标签: c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
main () {
    int arr[30];
    int *array;
    int sum = 0;
    int i, j;
    int guidedlen = 10;
    for (i = 0; i < guidedlen; i++) {
        arr[i] = sum + 10;
        sum += 10;
    }
    printf ("\n");
    array = (int *) calloc (guidedlen, sizeof (int));
    for (i = 0; i < guidedlen; i++) {
        array[i] = arr[i];
        array[i] = array[i] + 10;
        printf ("%d ", array[i]);
    }
    printf ("\n");
    memcpy (arr, array, sizeof (int) * guidedlen);
    for (i = 0; i < guidedlen; i++)
        printf ("%d ", arr[i]);
    printf ("\n");
    for (i = 0; i < guidedlen; i++)
        printf ("%d ", array[i]);
    free (array);
    printf ("\n");
    for (i = 0; i < guidedlen; i++)
        printf ("%d ", array[i]);
    return 0;
}

我正在实现上面的代码,我得到了我想要的答案。但是在自由声明之后,当我打印数组时。它给出了输出:0 0 40 50 60 70 80 90 100 110.但我认为在释放数组之后它不会保留任何先前的值。但是这里的最后八个元素仍然保持着这些价值。请告诉我代码中的问题在哪里?

3 个答案:

答案 0 :(得分:1)

这是预期的行为。你正在做的是非法访问数组值。当你释放数组时,它所做的只是告诉操作系统你不再使用那个内存。除非在该数据之上分配其他内容,否则它实际上不会更改内存中的值。

它与硬盘驱动器类似。没有办法只是“删除”数据。如果你删除一个文件,它只是释放那些要被覆盖的块,但它实际上不会改变任何数据。这就是人们能够恢复被删除的旧文件的方式。

答案 1 :(得分:1)

释放内存后,您不应该假设内存内容有效。你不再拥有&#39;记忆。在释放后访问它是非法的。周期。

答案 2 :(得分:0)

此情况被称为&#34;悬空指针&#34;。

当一个对象被删除或解除分配时出现悬空指针,而不修改指针的值,这样指针仍然指向解除分配的内存的内存位置(释放内存后,指针仍然指向到相同的记忆位置)。

删除内存后,您不是内存的所有者。因此,内存位置中的值可能会更改(如果某些其他进程获取相同的内存位置),则可能不会。当您尝试在该位置打印值时,会导致未定义的行为。

为了避免悬空指针,在释放内存后将指针设为NULL

free (array);
array = NULL;