为什么释放指针 p(已分配到另一个指针 q 指向的位置)会同时释放 q?
指针q和p有不同的地址,但只指向相同的位置(即它们存储相同的地址,该地址为10。如果我弄错了,请纠正我)。这种矛盾绝对是由于我对指针的思考方式或free()函数的工作方式产生的,因为根据我的所知(并不多),由于q和p具有不同的地址,释放p不应该对q产生任何影响,除非我在理解指针方面出现了错误,或者free()函数/内存以一种奇特的方式工作。我想知道这是为什么。(我知道这篇文章:释放一个已分配的指针,但它没有解释为什么或如何确切地发生这种情况。)
//for example,
int *p = malloc(sizeof(int));
*p = 10;
int *q = malloc(sizeof(int));
q = p;
free(p);
//This frees q as well.
指针q和p有不同的地址,但只指向相同的位置(即它们存储相同的地址,该地址为10。如果我弄错了,请纠正我)。这种矛盾绝对是由于我对指针的思考方式或free()函数的工作方式产生的,因为根据我的所知(并不多),由于q和p具有不同的地址,释放p不应该对q产生任何影响,除非我在理解指针方面出现了错误,或者free()函数/内存以一种奇特的方式工作。我想知道这是为什么。(我知道这篇文章:释放一个已分配的指针,但它没有解释为什么或如何确切地发生这种情况。)
q = p;
,曾经分配给q
的内存已经“泄漏”了。 - trojanfoeq=p;
把p的值(也就是地址10进制表示法的00A1500)赋给了q,对吗?所以如果用盒子来比喻p和q,它们的值都是00A1500,但地址仍然不同。 - Cowgirlp
和q
都将包含相同的指针值,但是通过赋值q = p;
,分配给q
的内存将会丢失。当您调用free(p);
时,传递给free()
的是p
中的值 — 在您的假设中为 0x00A1500,而不是p
的地址;这与调用free(q)
相同。您是正确的 —&p != &q
,但问题在于存储在这两个单独地址中的值,由于q = p;
赋值,相同的值存储在两个地址中。 - Jonathan Lefflerint x = 10; p=&x; q=p; free(p);
,printf("%d",*p);
和printf("%d",*q);
将会输出有效结果 (10)。 - Cowgirlint *q = malloc(sizeof(int)); q = p;
,malloc()
函数返回的值将会被覆盖,导致无法恢复的内存泄漏。 - user3629249