C 我可以释放最初从另一个指针分配的内存吗?

C 我可以释放最初从另一个指针分配的内存吗?,c,pointers,malloc,C,Pointers,Malloc,如果我从另一个指针分配内存,然后声明一个指针等于另一个指针,那么我可以在新指针上使用free()释放与第一个指针分配的内存吗 例如: typedef struct foo{ int n; char c; } foo; foo* bar = malloc(sizeof(foo)); foo* tmp = bar; // declaring pointer identical to other pointer free(tmp); // can I do this to free *ba

如果我从另一个指针分配内存,然后声明一个指针等于另一个指针,那么我可以在新指针上使用
free()
释放与第一个指针分配的内存吗

例如:

typedef struct foo{
  int n;
  char c;
} foo;

foo* bar = malloc(sizeof(foo));
foo* tmp = bar; // declaring pointer identical to other pointer

free(tmp); // can I do this to free *bar?

是的,很好

在返回指向内存块的指针之前,
malloc
的实现很可能会将内存块标记为已分配

现在,您可以拥有任意数量的指针变量,这些变量指向这一块内存,您可以通过对其中任何一个变量调用
free
来释放内存

指针本身不包含有关其指向的内存是否已分配的信息。它只是指向它

int* i = malloc(sizeof(int) * 23);
int* j = i;

free(j); 
// free(i); // this is undefined behavior, the memory was already freed

是的,很好

在返回指向内存块的指针之前,
malloc
的实现很可能会将内存块标记为已分配

现在,您可以拥有任意数量的指针变量,这些变量指向这一块内存,您可以通过对其中任何一个变量调用
free
来释放内存

指针本身不包含有关其指向的内存是否已分配的信息。它只是指向它

int* i = malloc(sizeof(int) * 23);
int* j = i;

free(j); 
// free(i); // this is undefined behavior, the memory was already freed

是的,你可以做你想做的事。但它不是另一个指针,你释放的是同一个指针。当
malloc
返回一个指针时,它实际上是给您一个整数,它是为您保留的内存块的起始地址。内存用完后,将该地址传递给
free
。就免费而言,以下两者之间没有区别:

free(malloc(17));
,


在所有这些情况下,从
malloc
返回的值将变为
free
,这才是最重要的。

是的,您可以按要求执行。但它不是另一个指针,你释放的是同一个指针。当
malloc
返回一个指针时,它实际上是给您一个整数,它是为您保留的内存块的起始地址。内存用完后,将该地址传递给
free
。就免费而言,以下两者之间没有区别:

free(malloc(17));
,


在所有这些情况下,从
malloc
返回的值将变为
free
,这才是最重要的。

是的。(字符限制旁路。)如果我将一个指针传递到一个函数中,我可以释放该指针在函数中的内存吗?只要指针指向内存中的同一地址,就可以释放该地址的内存。指针变量的名称无关紧要,它指向的位置也很重要。是的,当遍历链表并释放每个节点时,这是标准做法
free()
完全不知道哪个变量正在传递要释放的值。重要的是,它是以前分配的指针值,以前没有被释放,或者
NULL
。除了@WeatherVane的注释外,还可以看看悬空的指针问题,这可能会让人非常困惑。在
free()
之后,您将有两个指针,这两个指针都是无效的对象位置。是。(字符限制旁路。)如果我将一个指针传递到一个函数中,我可以释放该指针在函数中的内存吗?只要指针指向内存中的同一地址,就可以释放该地址的内存。指针变量的名称无关紧要,它指向的位置也很重要。是的,当遍历链表并释放每个节点时,这是标准做法
free()
完全不知道哪个变量正在传递要释放的值。重要的是,它是以前分配的指针值,以前没有被释放,或者
NULL
。除了@WeatherVane的注释外,还可以看看悬空的指针问题,这可能会让人非常困惑。在
free()
之后,您将有两个指针,这两个指针都是无效的对象位置。事实上,几乎所有
i
的使用都是未定义的,因为变量
i
现在包含一个不确定的值,这与规范6.2.4p2中的规定一致。事实上,几乎所有
i
的使用都是未定义的,因为根据规范6.2.4p2,变量
i
现在包含一个不确定的值。