如果两个指针指向相同的内存地址,您是否只需要使用free(ptr)一次或两次?

说我们有一个结构...

struct node{
    int data;
    struct node *next;
};

struct node *new_node = malloc(sizeof(node));

struct node *temp_node = new_node;

如果我免费使用...

free(temp_node);

new_node也可以释放(因为地址不再存在)还是new_node只是指向NULL(在这种情况下,我也需要释放new_node)吗?

干杯!

cgwsb 回答:如果两个指针指向相同的内存地址,您是否只需要使用free(ptr)一次或两次?

您不释放指针,而是释放分配的内存块-指针指向其地址。

使用malloc,它返回指向分配的内存块的指针,如下所示:

             +--------+
             |        |
new_node --> | 0x1000 |
             |        |
             +--------+

如果0x1000是该内存块的起始地址,则new_node指向的内容(即new_node == 0x1000)。

new_node分配给temp_node时,temp_node指向相同的内存块(即temp_node == 0x1000):

             +--------+
             |        |
new_node --> | 0x1000 | <-- temp_node
             |        |
             +--------+

但是您只分配了一块内存。因此,一旦您通过任一指针释放了它,另一个指针就会自动失效,并且不再允许您通过任一指针访问该块。

以相同的方式,您可以将其分配给任意数量的指针,但是只要通过一个指针将其释放,就可以完成。这就是为什么在四处复制指针时需要格外小心(因为如果释放指针,它可能仍会被无意使用)。

P.S .:释放指针之后可能会指向NULL,也可能不会指向NULL,这只是访问释放内存的未定义行为。

,

有很多例外情况,但是作为一般规则,每次调用free时都应该恰好有一个调用malloc

当您将一个指针变量分配给另一个指针变量时,您正在复制指针值-您分配更多的内存。因此,指针复制不会不是暗含需要再次调用free

,

思考的方式类似于:指向存储位置的指针指向free()将指针指向的内存返回系统。 因此,如果您有两个指针-调用free后,内存将返回给系统。您仍然有两个指针。而且它们仍然指向相同的存储位置。只是现在这不是您的记忆,而是系统的:)

简而言之-free的次数是您malloc的次数。

,

因为您正在释放内存,而我在这里只看到一个malloc,所以您只应该free()一次。

通常,对于每个malloc,必须只有一个free。 否则,将出现双重free错误。

,

对于一个内存地址,您只需调用一次free

一旦调用free,它将告诉操作系统您分配的内存可以再次使用。您不需要第二次调用free(也不必这样做,因为那是未定义的行为)。

,

关于代码的一些注释

  • 声明struct *nextstruct *temp_node指向 没有实例的未命名结构。
  • node只是用于命名结构的结构标签 不能在像malloc(sizeof(node))这样的表达式中使用。

如果这是您原本的意思:

struct node{
  int data;
  struct node *next;
};
struct node * new_node = malloc(sizeof(struct node));
struct node * temp_node = new_node;

那么这篇文章之前提供的答案是完全准确的。

,
#include<stdio.h>
#include<stdlib.h>

struct Node
{
    int data;
    struct Node * next;
}* first=NULL;

int main()
{
    first=(struct Node *)malloc(sizeof(struct Node));
    first->data=5;
    first->next=NULL;

    struct Node * t=first;

    printf("%d",t->data);

    free(first);

    printf(" %d ",t->data);
}

在这种情况下,虽然 First 在 main 中被释放,然后 t 也会打印数据。 这表示分配的内存块可以进一步用于不同的分配,但它仍然存在并且可以在指针指向它时使用。

但如果进行了新分配,则该内存块可能会分配给另一个变量。因此在释放内存后,它的行为是未定义的。

本文链接:https://www.f2er.com/3141507.html

大家都在问