我是C编程的新手,我正在玩malloc()
,free()
和指针赋值,以便更好地掌握它。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#define SIZE 10
void
array_fill(int * const arr, size_t n)
{
size_t i;
for (i = 0; i < n; i++)
arr[i] = i;
}
void
array_print(const int * const arr, size_t n)
{
size_t i;
for (i = 0; i < n; i++)
printf("%d ", arr[i]);
printf("\n");
}
int
main(int argc, char ** argv)
{
int * p1, * p2;
p1 = (int *) malloc(SIZE * sizeof(int));
p2 = p1;
array_fill(p1, SIZE);
array_print(p1, SIZE);
array_print(p2, SIZE);
printf("\nFREE(p1)\n");
free(p1);
array_print(p2, SIZE);
return (0);
}
使用gcc test.c -o test
进行编译并使用./test
运行
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
FREE(p1)
0 0 2 3 4 5 6 7 8 9
p2 = p1
,这是否意味着p2
指向与p1
相同的值?p1
后,为什么我仍然可以打印p2
(索引1的值不同)?我是否导致任何内存泄漏或指针悬空?p2
甚至p1
已被释放?答案 0 :(得分:3)
1)是
2)你正在访问释放的内存,这是一件坏事。
3)行为未定义。它可以工作,它可能会崩溃,它可能会打印垃圾,它可能会把我们都吸进黑洞(尽管不太可能)
答案 1 :(得分:3)
p2 = p1
,这是否意味着p2
指向与p1
相同的值?
是的,在赋值后,两个指针都指向同一个内存区域。
释放
p1
后,为什么我仍然可以打印p2
(索引1的值不同)?我是否导致任何内存泄漏或指针悬空?
是的,一旦你释放p1
,p2
指针就会悬空。通过它访问任何内容都是未定义的行为。
即使p1被释放,这是正常的能够打印p2吗?
不,这是未定义的行为。
不要让你看到的数字看起来像你之前曾混淆过你的数字:与你在调用free
之前的数字有任何相似之处是完全巧合。不幸的是,像这样的巧合使悬垂指针的问题极难找到。为了解决这个问题,内存分析器程序接管了free
- d区域,并故意在其中写入一些垃圾值。这使得检测更快,但它不是防弹的。
答案 2 :(得分:2)
答案 3 :(得分:1)
1)存储在指针中的值是内存地址。这意味着,具有相同值的两个指针指向相同的地址,这意味着相同的内存区域。
2)释放指针p1
仅将p1
的值设置为NULL
,并表示p1
指向的内存可以免费使用,并且不再使用保留。但它并没有抹去记忆。它仍然保持着它的价值。但是,通过另一个仍然具有地址的指针访问它是一种未定义的行为,因为它可以保留给另一个东西。
3)是的,这是正常的,因为它已在(2)中解释过;内存区域未被删除或设置为0
s,p2
仍然指向地址,这意味着它仍然打印相同的值
请注意,如果稍后由malloc
保留内存区域,则打印p2
可能会在修改内存区域时打印另一个值。