C指针释放后不为空

5jvtdoz2  于 2023-01-01  发布在  其他
关注(0)|答案(6)|浏览(163)

释放指针后指针的值是否变为NULL?

int* p = malloc(sizeof(*p));

free(p);

if(p==NULL)
    printf("Null\n");
else
    printf("Not null\n");

输出:

Not null

好吧,我想没有;
无论如何,我今天较早时曾问过一个问题:
点击这里查看:C - How can I free dynamically allocated memory?

List* head1 = NULL;

insertFront(&head1, 1);
insertFront(&head1, 2);

print(head1);

while (head1)
{

    List *temp = head1;
    head1 = head1->next;
    free(temp);
}

if(head1 == NULL)
    printf("Null\n");
else
    printf("Not null\n");

这种情况下的输出:

Null

在这种情况下,释放head1(也包括节点)后,head1变为空,不是吗?
最后,我是不是漏掉了一些概念?
head1为空,但p不为空。
我的问题是:

    • 为什么head1和p之间的值不同?**
8wigbo56

8wigbo561#

释放指针不会更改其值。
如果这是您想要的行为,您需要在释放它之后手动将其设置为NULL

8zzbczxx

8zzbczxx2#

当你free一个指针的时候,你并没有改变它的值,你只是把它所指向的内存返回到池中。
事实上,free取指针的 value 而不是它的 address,仅凭这一点就足以告诉你值没有改变,因为没有办法改变它。
head1在循环结束时是NULL的原因是因为你在循环中修改了head1的值,使其在列表中向下移动,直到到达末尾。当我们在next指针中找到一个NULL值时,我们就知道我们在列表的末尾。所以在循环结束时,head1NULL

njthzxwz

njthzxwz3#

循环的条件

while (head1)
       ^^^^^^
{

    List *temp = head1;
    head1 = head1->next;
    free(temp);
}

当下一节点的数据成员next等于NULL时,变为等于false

head1 = head1->next;
^^^^^         ^^^^^

这与函数free没有任何共同之处,该函数通过值接受参数,也就是说,它处理的是原始[指针的副本,因此原始指针本身不会改变。

a9wyjsp7

a9wyjsp74#

当你分配内存时,指针自然会指向所分配的块的开头供你引用。然而,当你释放一个指针时,只有内存本身被释放。
问题是指针仍然指向内存中先前设置的位置,即使该内存块的值不再有用。
设置为NULL不是释放后的自动操作。

wr98u20j

wr98u20j5#

如上所述,释放指针与改变指针的值无关,它只是告诉内存管理相关的块(在堆上)可以重用。
此SO问题提供了更多信息:What is the difference between freeing the pointer and assigning it to NULL?

vdzxcuhz

vdzxcuhz6#

free()并不意味着销毁,它只是做它所说的,它释放内存空间,所以在使用free()之后,程序员仍然可以自由地使用指针,通过realloc()将内存空间重新分配到堆上。
示例:

int * ptr = (int*) calloc(1, sizeof(int));
*ptr = 100;
printf("ptr contains = %d\n", *ptr);
free(ptr);
ptr = (int*) realloc(ptr, (2 * sizeof(int)));
*ptr = 100;
*(ptr + 1) = 200;
printf("ptr = %d ptr+1 = %d\n", *ptr, *(ptr + 1));

只有当你真的用完了那个指针,并且你不希望它被释放,而是希望它被破坏,不可访问时,你才把它设置为NULL。

相关问题