我知道,如果我们使用“按值调用”来调用函数,我们无法覆盖函数内部传递给函数的值,并且如果函数返回指针值,我们不得尝试返回本地地址变量(函数的局部变量),因为该局部变量在函数执行后被销毁(这会导致警告),但请看一下这段代码:
#include <stdio.h>
int *fun(int x,int y, int c[]){
c[0]=100;
x=887;
return &c[0];
}
int main()
{
int x=10,y=20,*z;
int c[]={1,2,3,4,5};
z=fun(x,y,c);
printf("%d\n",*z);
printf("%d\n",c[0]);
printf("%d\n",x);
return 0;
输出是:
100 100 10
所以,我们没有改变“x”的值(主函数x),但我们实际上改变了c[0](主函数c[0])的值,据我所知,这是不可能的,因为我使用按值调用而不是按引用调用,您能给我解释一下吗?
而且,如果我更改代码行“return &c[0];”对于这行代码“return &x;”我在第一个语句中没有收到警告,但在第二个语句中收到警告,为什么会发生这种情况?
当指针引用一个对象时,您可以通过取消引用指针来更改该对象。该对象在哪里并不重要(当然,如果该对象存在 - 当您返回指向自动存储持续时间的指针时,这是一个问题)。
而且,如果我更改代码行“return &c[0];”对于这条线 代码“return &x;”我在第一个声明中没有收到警告,但我 第二秒就收到警告,为什么会发生这种情况?
<source>:18:12: warning: function returns address of local variable [-Wreturn-local-addr]
18 | return &x;
| ^~
如果您使用此指针,您将调用未定义行为,因为当函数返回时,对象
x
停止存在