c语言函数参数传地址时容易发生的错误

首先看两个函数

函数1:

void assign1(int *x)
{
  int a=100;
  x=&a;
}

函数2:

void assign2(int * x)
{
  int a=100;
   *x=a;
}

然后 我们写个demo测试一下两个函数
demo1:

#include <stdio.h>
int main(int argc, char const *argv[])
{
    int *p,b=100;
    p=&b;
    printf("p=%0x\n",p);
    void assign1(int *x)
    {
    printf("%0x\n",&x);
     int a=1000;
     x=&a;
    }
    assign(p);
    printf("b=%d",*P);
    return 0;
}

结果:

b=100

demo2

#include <stdio.h>
int main(int argc, char const *argv[])
{
    int *p,b=100;
    p=&b;
    printf("p=%0x\n",p);
    void assign2 (int *x)
    {
     printf("%0x",&x);
     int a=1000;
     x=&a;
    }
    assign2(p);
    printf("b=%d",*P);
    return 0;
}

结果:

b=1000

其实从两个demo中答应参数的地址可以看出,
参数x是有自己重新分配的地址,和实参的地址是完全不同的,
形参在函数栈调用结束后会收回栈帧,也就是之前分配的变量。
所以在demo1中只是对形参x进行赋值。

但在demo2中*x 和 *p 指向的同一个地址,故操作能生效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值