bwwmmc 发表于 2019-10-10 01:16:39

指针作为函数参数出现错误

#include<stdio.h>

int a=10;
int b=5;

void change(int *p){
        p=&b;
}

int main(){
        int *p=&a;
        change(p);
        printf("%d",*p);
}


为啥这段代码输出结果是10而不是5?我写这种指针作为参数的函数经常会出现SIGSEGV(Segment fault)这样的错误是为啥?大家帮忙解决一下{:10_266:}


#include<stdio.h>

int a=10;
int b=5;

int main(){
        int *p=&a;
        p=&b;
        printf("%d",*p);
}

上面这段代码输出就是5了{:10_277:} 明明只是把p=&b写成一个函数而已啊,是哪里出问题了吗?

bin554385863 发表于 2019-10-10 03:40:28

你交换的是两个数字,你的函数却只有一个形参,你觉得合适么?

bin554385863 发表于 2019-10-10 03:43:39

正确的写法是
void _swap(int *a, int *b)
{
      int t = *a;
      *a = *b;
      *b = t;
}

jackz007 发表于 2019-10-10 11:12:49

本帖最后由 jackz007 于 2019-10-10 11:16 编辑

      change(p) ;

      你是希望把 p 作为指针参数传入函数 change(),然后,在函数中直接修改 p,再把变化传递回调用函数,这种想法是好的,但是,却行不通。因为参数 p 虽然是指针,但是,在函数 change() 内部仍然属于临时变量,是在堆栈中分配存储空间的,会在函数退出时的退栈操作后自然消失。所以,对 p 的修改根本无法传递到调用函数。
      那么,怎么办呢?如果希望通过函数修改某个参数,那就应该传入这个参数的地址,而不是这个参数本身,这就是答案!

      明白了这个道理,你的代码就好改了:

#include <stdio.h>

int a = 10 ;
int b = 5;

void change(int ** p)
{
      * p= & b         ;
}

int main()
{
      int * p = & a      ;
      change(& p)      ;
      printf("%d\n",* p) ;
}
   
页: [1]
查看完整版本: 指针作为函数参数出现错误