在实际指针的副本上使用free()是可接受/正确的吗?
这是:
int *a = malloc (sizeof (int) ); int *b = a; free (b);
与此相同:
int *a = malloc (sizeof (int) ); free (a);
如果是,不需要解释,但如果没有,请详细说明原因!
是的,它们是等价的。
引用C11
,章节§7.22.3.3,( 强调我的 )
free
函数导致ptr
指向的空间被释放,即可用于进一步分配。 如果ptr
是空指针,则不执行任何操作。 否则,如果参数与先前由内存管理函数返回的指针不匹配,或者如果通过调用free
或realloc
释放了空间,则行为未定义。
因此,只要您传递之前由malloc()
或系列返回的相同ptr
值(指针本身或其副本malloc()
,您就可以了。
当x == y
时, free(x)
与free(y)
相同的原因与free()
函数无关。 这只是因为free()
是一个函数。 在C中,任何函数的参数都按值传递。 因此对于任何函数f
,只要y == x
, f(x)
就等于f(y)
。
顺便说一句,对于类似函数的宏来说,这不一定是正确的,它可能看起来像函数,但事实上并非如此。 所以,如果你有一个宏,如:
#define myfunc(x) do_something(&x)
然后myfunc(x)
几乎肯定会有一个与myfunc(y)
不同的结果,即使x == y
,因为真正的函数是do_something()
,并且参数传递给它&x
和&y
。 即使x
等于y
, &x
也不等于&y
,因此传递给函数的参数实际上并不等于值,因此预期函数的行为会有所不同。