C/C++易错问题分析
2016-04-18 19:22
288 查看
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、头文件编码规则
相关文章推荐
- java和c语言一些数组差别
- C++ WINDOWS API 第2章 Windows API概要
- C++ WINDOWS API 第1章 Windows 应用程序开发入门
- C++ 之 常量成员函数
- leetcode笔记:Power of Four
- C++计算代码片运行时间
- C++冒泡排序
- c++代码同步系统时间
- C语言中的隐式转换
- C++线程 基础教程
- 求最大公约数(c++)
- C++ Member Functions的各种调用方式
- 用C++ 实现复杂链表的复制
- C++STL中vector容器 begin()与end()函数、front()与back()的用法
- C++中的接口继承和实现继承
- [C++]函数对象(二)
- remove_if 的用法
- 1--C语言关键字
- C++学习笔记23,类内函数重载
- vs c++内存泄露检测【模板】