指针赋值,C语言中的malloc()和free()



我是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
  1. p2 = p1,是否意味着p2指向与p1相同的值?
  2. 释放p1后,为什么我仍然可以打印p2(索引1的值不同)?我是否导致任何内存泄漏或指针悬空?
  3. 能够打印p2甚至p1被释放是正常的吗?

p2 = p1,这是否意味着p2指向与p1相同的值?

是,赋值后两个指针都指向同一内存区域。

释放p1后,为什么我仍然可以打印p2(索引1的值不同)?我是否导致任何内存泄漏或指针悬空?

是的,一旦释放了p1, p2指针就会悬空。通过它访问任何东西都是未定义的行为。

即使释放了p1,也能打印p2是正常的吗?

不,这是未定义的行为。

不要让你看到的数字看起来像你以前看到的数字的事实迷惑你:任何与你调用free之前的数字的相似之处都是完全的巧合。不幸的是,这样的巧合使得悬空指针的问题非常难以发现。为了帮助解决这个问题,内存分析器程序接管free -d区域,并故意将一些垃圾值写入该区域。

1)是

2)你正在访问释放的内存,这是一件坏事。

3)行为未定义。它可以工作,它可以崩溃,它可以打印垃圾,它可以把我们都吸进黑洞(尽管不太可能)

  1. 是,p2指向与p1相同的区域。
  2. 显然,内存被释放了,但它还没有被重用(尽管,一个值已经被覆盖了)。在释放内存之后,你不应该通过另一个指针访问它。
  3. 可能导致未定义的行为。在您的例子中,它打印了损坏的数组。它也可能因分段错误而崩溃(如果内存页不再属于您的应用程序)。行为可能会根据操作系统,编译器和其他东西而改变,所以最好避免这种做法。

1)指针中存储的值是内存地址。这意味着,两个值相同的指针指向相同的地址,这意味着相同的内存区域。

2)释放指针p1只将p1的值设置为NULL,并且表示p1所指向的内存是可以使用的,不再保留。但这并不能抹去记忆。它仍然保持着它的价值。但是,通过另一个仍然拥有该地址的指针访问它是一种未定义的行为,因为它可以保留给其他东西。

3)是的,这是正常的,因为它已经在(2)中解释过;内存区域没有被擦除或设置为 0s, p2仍然指向地址,这意味着它仍然打印相同的值

请注意,如果内存区域被malloc保留,那么如果内存区域被修改,打印p2可能会打印另一个值。

相关内容

  • 没有找到相关文章

最新更新