C/C++易错问题分析

17 篇文章 0 订阅

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值