C/C++易错问题分析
来源:互联网 发布:少儿英语机构 知乎 编辑:程序博客网 时间:2024/04/29 19:15
1、若要通过函数参数传出值A,则需要传入A的指针形式
传给函数形参的实参是作为拷贝传入,在函数体内改变作为拷贝的实参2是不会影响到传入的实参1的。
ex:
void get_addr(int *p){ p = 0xEEFF;}void main(){ int *t = NULL; get_addr(t);}
应该改为如下的:
void get_addr(int **p){ *p = 0xEEFF;}void main(){ int *t = NULL; get_addr(&t);}
【规则】
1、如果想要通过函数接口改变传入的数值,那么需要传入该数值的指针。
2、如果想要改变传入的指针所指向的值,那么需要传入该指针的指针。总之,需要深一层。
2、不要返回一个函数内部的局部变量的地址
int fun(){ int ret = 0; //do some things return ret;}int fun1(){ int ret = 0; //do some things return &ret; //不要返回局部变量的地址,因为函数返回后ret已经销毁}
【修改方法】
由上层调用函数分配好一个指针空间,然后将该指针传给fun(int *p) { *p = some value}
3、强制类型转换需要注意:内存越界、大小端、
1、小类型->长类型
将一个单字节的数据转换成两个字节的数据,会造成内存越界,改写其他变量的内容(另一个字节被改变了)
unsigned char a = 9; f((unsigned short)a) //将一个单字节的数据转换成两个字节的数据 //do some things
2、长类型->小类型
4、整数溢出漏洞
两个有符号整数相加、相乘等都会有溢出的风险!!!!两个无符号数相加、相乘可能会出现无符号数反转风险!!!
void fun(){ int n = gets_fun(); if(!(msg = calloc(1, n+1))) //此处有错 { //do something }}
如果n等于了int表示的最大值UINT_MAX,那么n+1将会等于0,那么会执行calloc(0)。。。。
对于memcpy有规定:void * memcpy ( void * destination, const void * source, size_t num );
num是无符号整数,如果用户传入了一个负数,那么将会导致解析成一个巨大的无符号数。
4、头文件编码规则
0 0
- C/C++易错问题分析
- 一道C++/MFC/VC6问题分析题
- C/C++程序CPU问题分析
- C/C++遇到的问题及分析
- C、C++、java分析
- C++/C源码分析
- 【C/C++】报错问题积累
- C++/C 颜色问题
- C++/C const问题
- CodeForces 283C Coin Troubles 背包问题 分析问题
- C问题
- c问题
- c问题
- c问题
- C问题
- 词法分析程序 C++/C
- C语言结构体做参数易错情况分析
- C语言之Main函数返回值问题分析
- oracle 数据库事务,提交,回滚,保存点,表的锁定,隐式锁,显示锁,写锁,读锁,排他锁,共享锁
- Android 图片下载工具类:BitmapUtil
- 第0章--win8系统中装ubuntu和windows双系统的步骤(一)
- 通过telnet连接查看memcache服务器
- oracle 视图创建和操作,创建简单,复杂的视图,创建基表不存在的视图,视图增删改,查看视图的结构
- C/C++易错问题分析
- eclipse使用sonar平台审查规则进行审查
- Java Thread 状态转换
- WinSCP的使用方法
- Ubuntu下安装配置JDK的两种方法
- 动态规划-最长公共子字符串(LCS)
- DHU 4135 co-primer(容斥原理)
- Android Dialog 使用举例
- jenkins参数化构建过程