鱼C论坛

 找回密码
 立即注册
查看: 1713|回复: 3

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

[复制链接]
发表于 2019-10-10 01:16:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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)这样的错误是为啥?大家帮忙解决一下


#include<stdio.h>

int a=10;
int b=5;

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

上面这段代码输出就是5了 明明只是把p=&b写成一个函数而已啊,是哪里出问题了吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-10 03:40:28 From FishC Mobile | 显示全部楼层
你交换的是两个数字,你的函数却只有一个形参,你觉得合适么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-10 03:43:39 From FishC Mobile | 显示全部楼层
正确的写法是
void _swap(int *a, int *b)
{
        int t = *a;
        *a = *b;
        *b = t;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-10 11:12:49 | 显示全部楼层
本帖最后由 jackz007 于 2019-10-10 11:16 编辑
  1.         change(p) ;
复制代码


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

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

  1. #include <stdio.h>

  2. int a = 10 ;
  3. int b = 5  ;

  4. void change(int ** p)
  5. {
  6.         * p= & b           ;
  7. }

  8. int main()
  9. {
  10.         int * p = & a      ;
  11.         change(& p)        ;
  12.         printf("%d\n",* p) ;
  13. }
复制代码
   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 02:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表