在C中,使用指针,为什么可以在函数内覆盖数组元素,为什么我们可以返回这个数组元素的地址?

问题描述 投票:0回答:1

我知道,如果我们使用“按值调用”来调用函数,我们无法覆盖函数内部传递给函数的值,并且如果函数返回指针值,我们不得尝试返回本地地址变量(函数的局部变量),因为该局部变量在函数执行后被销毁(这会导致警告),但请看一下这段代码:

#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;”我在第一个语句中没有收到警告,但在第二个语句中收到警告,为什么会发生这种情况?

arrays c function pointers
1个回答
0
投票

当指针引用一个对象时,您可以通过取消引用指针来更改该对象。该对象在哪里并不重要(当然,如果该对象存在 - 当您返回指向自动存储持续时间的指针时,这是一个问题)。

而且,如果我更改代码行“return &c[0];”对于这条线 代码“return &x;”我在第一个声明中没有收到警告,但我 第二秒就收到警告,为什么会发生这种情况?

  1. 在命令行中启用警告。例如,如果使用 GCC -Wall -Wextra。然后你就会收到警告。
<source>:18:12: warning: function returns address of local variable [-Wreturn-local-addr]
   18 |     return &x;
      |            ^~

如果您使用此指针,您将调用未定义行为,因为当函数返回时,对象

x
停止存在

© www.soinside.com 2019 - 2024. All rights reserved.