c/c++ 开发中常见的坑

本文总结了C/C++开发中的若干问题,包括变量初始化、实参合法性判断、赋值混淆、内存管理、网络通信中的TLV结构、大端小端、结构体内存对齐、加密解密流程以及函数和编译类的常见误区。强调了初始化变量的重要性,指出了网络通信中需要注意的细节,并提醒开发者在使用特定函数和标准时要关注兼容性和安全风险。

总结一下自己遇到的坑,吸取教训,避免第二次、第三次在同一个地方扑街。

语言类

  • 变量初始化问题

众所周知,局部变量在函数调用开始时创建,函数调用完成返回时“销毁”。值得注意的是,这里根本没有所谓的销毁、初始化的过程。局部变量的内存分配、回收是通过栈指针(esp)的减小、增大来完成的,注意函数栈从大地址向小地址增长。也就是说,函数栈只管分配和回收,至于这个地址空间里的内容, 它不关心,初始化工作要由程序员完成。同理,由malloc分配的空间,初始化工作也要由程序员完成。

使用未经初始化的变量,在写入值时,不会发生任何问题。但是在读取它的值时,就有可能发生错误。更要命的是,这种错误有可能在某段时间内、某个主机上(就是你的开发环境)一直不出现,一到测试环境、客户环境就会随机出现问题!由于局部变量的空间分配之前,可能被其他函数变量所用,这个空间的值刚好被置为0,这时再将这个空间分配给你的未初始化变量,就不会出现问题。而刚好在某一段时间内,函数调用流程是固定的,那么这个问题就“刚好”一直不会出现。但是我们不能一直跪地祈祷xx保佑不要出现问题,所以,记住这个血与泪的教训:定义变量时,一定要明确是否需要初始化。

问题示例:

#include <stdio.h>

void main_loop(int argc, char **argv)
{
        int i;

        while (i < argc) {

                i--;
        }
}

int main(int argc, char *argv[])
{
        main_loop(argc, argv);
        return 0;
}

初始化示例:

int i = 0;
int *p = NULL;
char buf[1024] = {0};
struct st_ipc ipc;
memset(&ipc, 0, sizeof(ipc));

  • 实参合法性判断问题

在开发api给其他人用,或者自己封装api时,往往要注意实参的检查。最常见的是指针、数据范围的判断。这是增强程序健壮性的必备手段。而在每个函数入口检查参数,自然会有一堆重复代码。这时候宏的作用就体现出来了:

#ifdefine DEBUG_EN
#define DEBUG(fmt, args...)     \
        do {                    \
                printf("DEBUG:%s-%d-%s "fmt, __FILE__, __LINE__, __FUNCTION__, ##args);\
        }while(0)

#define ERROR(fmt, args.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值