总结一下自己遇到的坑,吸取教训,避免第二次、第三次在同一个地方扑街。
语言类
-
变量初始化问题
众所周知,局部变量在函数调用开始时创建,函数调用完成返回时“销毁”。值得注意的是,这里根本没有所谓的销毁、初始化的过程。局部变量的内存分配、回收是通过栈指针(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.

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

2383

被折叠的 条评论
为什么被折叠?



