在实际指针的副本上使用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是空指针,则不执行任何操作。 否则,如果参数与先前由内存管理函数返回的指针不匹配,或者如果通过调用freerealloc释放了空间,则行为未定义。

因此,只要您传递之前由malloc()或系列返回的相同ptr值(指针本身或其副本malloc() ,您就可以了。

x == y时, free(x)free(y)相同的原因与free()函数无关。 这只是因为free()是一个函数。 在C中,任何函数的参数都按值传递。 因此对于任何函数f ,只要y == xf(x)就等于f(y)

顺便说一句,对于类似函数的宏来说,这不一定是正确的,它可能看起来像函数,但事实上并非如此。 所以,如果你有一个宏,如:

 #define myfunc(x) do_something(&x) 

然后myfunc(x)几乎肯定会有一个与myfunc(y)不同的结果,即使x == y ,因为真正的函数是do_something() ,并且参数传递给它&x&y 。 即使x等于y&x也不等于&y ,因此传递给函数的参数实际上并不等于值,因此预期函数的行为会有所不同。