2011-12-22 81 views
2

请参阅下面的一段代码和我对结果的解释。需要帮助了解指针语义

void f (int * p, int * q) 
{ 
    p = q; 
    *p = 2; 
} 

int i = 0; 
int j = 1; 

int main() 
{ 
    f(&i, & j); 

    printf("%d %d\n", i, j); 

    return 0; 
} 

我们有两个全局变量ij,我们通过这两个变量的函数指针f。当我们做p = q时,我们实际上放弃了i的参考,我们得到两个指针,即pq都指向j。那么当我们做*p = 2时,我们实际上将j的值更改为2

然而,正如我们在步骤p = q丢失的i基准,在主程序中,获取打印的i值是全局变量是0。因此我们得到结果为i = 0j = 2

,请告诉我,如果这是一个正确的解释...

现在另一个问题是,当我们在函数f做p = q,它会创建一个内存泄漏,因为以前由p指向的价值将无法访问。

+0

“它会创建一个内存泄漏,因为先前由p指向的值将无法访问......”:只有在函数f中它才会不可用。但它仍然是主要的访问。变量p和q只在'f'中存在,而不是在main或其他函数中。 – 2011-12-22 01:50:46

+1

[comp.lang.c FAQ](http://c-faq.com)是一个很好的资源。第4节讨论指针。 – 2011-12-22 02:43:53

+0

这是一个简单的问题...在问这里之前检查cfaq – 2011-12-22 05:07:43

回答

0

这样的功能p = q只改变局部变量p,所以i不受影响,并在&imain仍调用函数之前相同。另外,如果使用malloc()calloc()而没有相应的free()(包括等效使用realloc()),则只能存在内存泄漏。

否则,您的解释是正确的。

+0

你实际上也可能在静态内存中有内存泄漏:'const char * ptr =“hello”; ptr =“world”;' – Lundin 2011-12-22 07:40:54

+1

@Lundin不算作泄漏,因为你没有做任何事情可以“修复”它,对吧? – 2011-12-22 07:50:52

+0

就像动态内存泄漏一样,唯一的解决方案是不要在代码中写入错误。 – Lundin 2011-12-22 07:53:10