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

时间:2016-10-30 20:04:39

标签: 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 *bar?

2 个答案:

答案 0 :(得分:2)

是的,完全没问题。

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

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

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

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

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

答案 1 :(得分:2)

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

free(malloc(17));

void *p = malloc(17);
free(p);

void *p1 = malloc(17);
void *p2 = p1;  
free(p2);

在所有这些情况下,malloc返回的值都会转到free,这就是最重要的。