当前位置: 首页 > news >正文

指针传参误区

C语言中指针作为形参传递时,func(*a, *b) 这种形式的话,是无法通过简单的 a=b来修改的,在函数体内a的地址确实被修改成b的地址了,但是当函数执行结束时,a的地址会重新回到原本的地址里面,这边是由于函数执行结束,函数的栈地址被释放了,若是要获取a修改的地址可以采用一下两种形式获取:
形式1:return addr;

#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <malloc.h>static int * test(int*a,int*b)
{a = b;return a;
}
int main(int argc, char *argv[])
{int *a = NULL;int te = 10;int *b = &te;a = test(a,b);printf("a=%d",*a);return 0;
}

在这里插入图片描述
形式2:采用二级指针的形式,func(**a,*b)

#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <malloc.h>static void test(int**a,int*b)
{*a = b;
}
int main(int argc, char *argv[])
{int *a = NULL;int te = 12;int *b = &te;test(&a,b);//传入一级指针a的地址printf("a=%d",*a);return 0;
}

在这里插入图片描述
同样的若是要修改指针a的内容,如果a为空指针在函数内调用 *a=*b;就会造成段错误,

#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <malloc.h>static void test(int*a,int*b)
{*a = *b;
}
int main(int argc, char *argv[])
{int *a = NULL;int te = 12;int *b = &te;test(a,b);printf("a=%d",*a);return 0;
}

在这里插入图片描述
野指针不会有这个问题,因为野指针会被随机的分配一块内存空间,但是实际使用中仍不建议这样使用,使用野指针操作,可能会踩到其他内存空间造成莫名其妙的死机,并且很难排插问题。
在这里插入图片描述

http://www.lryc.cn/news/276173.html

相关文章:

  • 力扣-42.接雨水
  • LeetCode-移动零(283)
  • 文件系统与日志分析
  • labview 与三菱FX 小型PLC通信(OPC)
  • 掌握Linux网络配置:价格亲民,操作简便!
  • 郑州大学算法设计与分析实验2
  • 【CMake】1. VSCode 开发环境安装与运行
  • 使用vue3+<script setup>+element-plus中el-table前端切片完成分页效果
  • vue 中 computed 和 watch 的区别
  • gephi——graphviz插件设置
  • wireshark抓包分析HTTP协议,HTTP协议执行流程,
  • Linux第13步_安装“vim编辑器”及应用介绍
  • Yapi安装配置(CentOs)
  • HCIA-Datacom题库(自己整理分类的)_08_FTP协议【8道题】
  • 【开源GPT项目 - 在问】让知识无界,智能触手可及
  • 【2023 CCF 大数据与计算智能大赛】基于TPU平台实现超分辨率重建模型部署 基于Real-ESRGAN的TPU超分模型部署
  • Vue中的组件通信方式及应用场景
  • RA8900CE汽车用c总线接口实时时钟模块
  • 屏幕截图--Snagit
  • PHP运行环境之宝塔Web站点部署
  • 使用高版本JDK编译低版本代码
  • Zuul相关问题及到案(2024)
  • 【CSS】讲一讲BFC、IFC、GFC、FFC
  • 阶段十-分布式-任务调度
  • Godot4.2——爬虫小游戏简单制作
  • 对象的前世今生与和事佬(static)的故事
  • 报错curl: (6) Could not resolve host: raw.githubusercontent...的解决办法
  • 【基础篇】十二、引用计数法 可达性分析算法
  • C语言算法(二分查找、文件读写)
  • 流媒体学习之路(WebRTC)——Pacer与GCC(5)