繁体   English   中英

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

[英]Pointer Assignment, malloc() and free() in C

我是C编程的新手,我正在玩malloc()free()和Pointer Assignment,以便更好地掌握它。

这是我的代码:

#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. 即使p1被释放,这是正常的能够打印p2吗?

1)是的

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

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

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

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

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

是的,一旦你释放p1p2指针就会变得晃来晃去。 通过它访问任何内容都是未定义的行为。

即使p1被释放,这是正常的能够打印p2吗?

不,这是未定义的行为。

不要让你看到的数字看起来像你之前曾混淆过你的数字:任何与你之前被称为free的数字相似的事情都是完全巧合。 不幸的是,像这样的巧合使悬垂指针的问题极难找到。 为了解决这个问题,内存分析器程序接管了free -d区域,并故意在其中写入一些垃圾值。 这使得检测更快,但它不是防弹的。

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

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

2)解放了指针p1只设置的值p1NULL和说,指向的内存由p1是免费使用的,它不再保留。 但它并没有抹去记忆。 它仍然保持着它的价值。 但是通过另一个仍然具有地址的指针访问它是一个未定义的行为,因为它可以保留给另一个东西。

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

注意,如果稍后由malloc保留存储器区域,则如果修改存储器区域,则打印p2可以打印另一个值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM