#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.但我认为在释放数组之后它不会保留任何先前的值。但是这里的最后八个元素仍然保持着这些价值。请告诉我代码中的问题在哪里?
答案 0 :(得分:1)
这是预期的行为。你正在做的是非法访问数组值。当你释放数组时,它所做的只是告诉操作系统你不再使用那个内存。除非在该数据之上分配其他内容,否则它实际上不会更改内存中的值。
它与硬盘驱动器类似。没有办法只是“删除”数据。如果你删除一个文件,它只是释放那些要被覆盖的块,但它实际上不会改变任何数据。这就是人们能够恢复被删除的旧文件的方式。
答案 1 :(得分:1)
释放内存后,您不应该假设内存内容有效。你不再拥有&#39;记忆。在释放后访问它是非法的。周期。
答案 2 :(得分:0)
此情况被称为&#34;悬空指针&#34;。
当一个对象被删除或解除分配时出现悬空指针,而不修改指针的值,这样指针仍然指向解除分配的内存的内存位置(释放内存后,指针仍然指向到相同的记忆位置)。
删除内存后,您不是内存的所有者。因此,内存位置中的值可能会更改(如果某些其他进程获取相同的内存位置),则可能不会。当您尝试在该位置打印值时,会导致未定义的行为。
为了避免悬空指针,在释放内存后将指针设为NULL
free (array);
array = NULL;