gpt4 book ai didi

c - 通过调用另一个函数将指针移动到某个地址

转载 作者:行者123 更新时间:2023-11-30 19:54:02 26 4
gpt4 key购买 nike

为什么在这段代码中指针会移动到另一个位置:

#include <stdio.h>

void f(int *p)
{
int j=2;
p=&j;
printf("%d\n%p\n%d\n",*p,&j,p);
}

int main(void)
{
int *q;
int m=98;
q=&m;
f(q);
printf("%p ",q);
return 0;
}

输出:

2
0x7ffff5bf1bcc
0x7ffff5bf1bcc
0x7ffff5bf1bc8

据我所知,当函数 f() 完成打印 j 的值和 地址 j 时,内存j 占用返回到堆栈,但 IMO p 应该继续指向该位置,即使在函数结束后也是如此,并且它应该打印相同 地址也在 ma​​in 中。这有什么问题吗?

最佳答案

考虑到您在实际代码中的意思是 printf("%p ", (void *)q);

不,C 中的函数参数是按值传递的。它不会将对参数所做的更改反射(reflect)到使用的实际参数(在函数调用中)本身。

换句话说,函数参数是函数(调用)作用域的本地参数,对它们所做的任何更改都不会反射(reflect)到实际参数中。

因此,如果您需要更改指针,则需要将指针传递给需要更改的指针。

考虑一个相当轻松但现实的场景。

void f (int x) { x = 10; }

int main(void) { f(5); printf ("%d", 5); return 0;}

现在,您希望它打印 10 吗?

<小时/>

也就是说,一个建议。始终将%p 转换说明符的参数强制转换为(void *)(如果还没有)。 printf() 是一个可变参数函数,对于指针来说,不会发生默认参数提升,因此提供的参数类型需要显式地与预期类型匹配。否则,从技术上讲,它是 undefined behavior .

关于c - 通过调用另一个函数将指针移动到某个地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45298760/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com