C设置指向另一个指针并释放的指针

时间:2018-04-03 14:27:00

标签: c pointers

如果我拨打free(ptr)

,p1也会免费吗?
int* some_function(){
    int *p1 = malloc(sizeof(int)*10);
    int *p2 = p1;
    return p2;
}
int main(){
    int *ptr = some_function();
    free(ptr);
    return 0;
}

4 个答案:

答案 0 :(得分:5)

当你这样做时

UICollisionBehavior

你有类似

的东西
+----+     +---------------------------------+
| p1 | --> | Memory enough for 10 int values |
+----+     +---------------------------------+

然后当你做

int *p1 = malloc(sizeof(int)*10);

你有类似

的东西
+----+
| p1 | --\
+----+    \     +---------------------------------+
           >--> | Memory enough for 10 int values |
+----+    /     +---------------------------------+
| p2 | --/
+----+

也就是说,你有两个指向同一个内存的指针。

当您返回int *p2 = p1; 时,您只需复制指针,就像初始化p2时所发生的情况一样,以及p2函数中的

main

导致

+-----+     +---------------------------------+
| ptr | --> | Memory enough for 10 int values |
+-----+     +---------------------------------+

它有不同的变量,但它们的内容都是相同的,它是初始int *ptr = some_function(); 调用返回的指针。

答案 1 :(得分:0)

some_function返回时,p1p2具有相同的值,即指向由malloc返回的内存区域的指针。然后使用return p2从函数返回该值。此处没有内存泄漏,因为malloc返回的值是从some_function返回的。这个值恰好存储在多个局部变量中的事实是无关紧要的。

然后在free(ptr)中调用main时,ptr的值再次是malloc返回的值,因此内存可以正确释放。

答案 2 :(得分:0)

指针是一个变量,其值是内存地址。你需要释放那个内存地址(你实际上释放了一个从该地址开始的块 - free会处理它),为了做到这一点,你需要传递给free指针它

你可以有多个指向内存位置的指针,并且,由于调用free并释放其中一个内存位置,它们现在都将指向自由内存(小心它们)。

答案 3 :(得分:0)

*p1只是一个地址大小的区域,如果系统使用long作为地址,而long用8个字节描述,则指针使用来自存储区的8个字节。如果你设置

*p2 = p1;

您只是将整数值复制到另一个整数值,该值将指向相同的地址。

例如:

int *p = malloc(3);

只是为了可视化,如果我们的堆存储器从0x0001开始,p将被保留用于保存起始地址,该地址是(0x0001),指向我们的3字节保留存储区。

int *p1 = p;

这个p1值也将指向3字节的存储区,由0x0001地址描述,因此它们将包含相同的值。

使用的总内存: p为4个字节,p1为4个字节,pp1的内存为3个字节点。

*ptr = somefunction();

然后,当您将该值返回到外部时,pp1将被释放,因为它们的范围是局部变量。我们只返回0x0001,这是我们的内存起始地址。保留的内存仍然保留。

如果你释放*ptr,它将释放保留的内存(在0x0001地址处为3个字节),因为它指向它。

在程序存在之前,*ptr仍会使用一些内存。

在我写这篇文章的时候,@ up-programmer-dude的回答是upvoted,因为他比我想象的更好。