C 需要帮助理解指针语义吗

C 需要帮助理解指针语义吗,c,pointers,C,Pointers,请参阅下面的代码和我对结果的解释 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; } 我们有两个全局变量i和j,我们将这两个变量的指针传递给函数f。当我们做p=q时,我们实际上失去了i的引用,我们得到了两个指针,即p和q都指

请参阅下面的代码和我对结果的解释

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; 
}
我们有两个全局变量
i
j
,我们将这两个变量的指针传递给函数
f
。当我们做
p=q
时,我们实际上失去了
i
的引用,我们得到了两个指针,即
p
q
都指向
j
。然后,当我们执行
*p=2
时,我们实际上将
j
的值更改为
2

但是,由于我们在步骤
p=q
中丢失了
i
的引用,在主程序中,打印的
i
的值是全局变量,即
0
。因此,我们得到的结果是
i=0
j=2

请告诉我这是不是一个正确的解释


现在另一个问题是,当我们在函数f中执行
p=q
时,它是否会因为p之前指出的值将无法访问而导致内存泄漏。

在函数中执行
p=q
只会更改局部变量
p
,因此
i
不会受到影响,而
main
中的
&i
仍与调用函数之前相同。此外,只有在使用
malloc()
calloc()
而没有相应的
free()
(包括等效使用
realloc()
)时,才能发生内存泄漏


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

在函数中执行
p=q
只会更改局部变量
p
,因此
i
不受影响,
main
中的
&i
仍与调用函数之前相同。此外,只有在使用
malloc()
calloc()
而没有相应的
free()
(包括等效使用
realloc()
)时,才能发生内存泄漏


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

“它是否会因为p先前指出的值将不可访问而导致内存泄漏…”:它将仅在函数
f
中不可访问。但基本上还是可以访问的。变量p和q只存在于
f
中,不存在于main或其他函数中。是一个很好的资源。第4节讨论了指针。这是一个简单的问题…在这里询问“它是否会因为p之前指出的值将不可访问而导致内存泄漏…”之前检查cfaq:它将仅在函数
f
中不可访问。但基本上还是可以访问的。变量p和q只存在于
f
中,不存在于main或其他函数中。是一个很好的资源。第4节讨论了指针。这是一个简单的问题…在询问之前检查cfaq。实际上,静态内存中也可能存在内存泄漏:
const char*ptr=“hello”;ptr=“世界”
@Lundin不算作泄漏,因为您所做的任何事情都无法“修复”它,对吗?就像动态内存泄漏一样,唯一的解决方案是不在代码中写入错误。@Lundin在该示例中,正确的方法是什么?而且,这只会“泄漏”一次,而不是每次执行该段代码时,因此这根本不是严重的泄漏,例如忘记删除某个
new
ed,这会在每次执行
new
时泄漏。正确的方法是声明一个常量数组来保存每个字符串文本,然后让指针指向该数组,而不是直接指向字符串文本;ptr=“世界”@Lundin不算作泄漏,因为您所做的任何事情都无法“修复”它,对吗?就像动态内存泄漏一样,唯一的解决方案是不在代码中写入错误。@Lundin在该示例中,正确的方法是什么?而且,这只会“泄漏”一次,而不是每次执行该段代码时,因此这根本不是严重的泄漏,例如忘记删除某个
new
ed,这会在每次执行
new
时泄漏。正确的方法是声明一个常量数组来保存每个字符串文本,然后让指针指向该数组,而不是直接指向字符串文本。