写程序时经常会遇见些莫名其妙的错误,往往花了大把时间找了很久的bug,最终发现这些都是很小很小的问题,所以把这些可能问题记下来备忘。
1.指针的加减操作,指针的加减操作都是其所指的内容相关的,好比char*+1等于实际地址+1,但int*+1等于实际地址+4,不能像当然的认为p+n就等于地址+n。
struct sdata
{
int length;
char* pdata;
};
sdata* pmem = (sdata*)malloc(1024);
pmem->pdata = (char*)(pmem + sizeof(sdata));
pmem->length = 0;
程序中我本意是给申请的内存加个头,便于管理,pdata指向可用内存地址,length记录内存所用长度,但是没有达到预期的效果,而且在运用中造成了严重的宕机。究其原因就是因为pmem->pdata = (char*)(pmem + sizeof(sdata));这句pmem做加法的时候所增长的长度远远大于预期,它是根据pmem所指的类型的长度增长的,即增长了sizeof(sdata)*sizeof(sdata)。如果想要地址实际增加sizeof(sdata),应该这样
pmem->pdata = (char*)((char*)pmem + sizeof(sdata)); 切记不要随便对指针做加减操作!2.整型提升相关
在一个表达式中,凡是可以使用整型的地方都可以使用带符号或无符号的字符、短整型或整型位字段,还可以使用枚举类型的对象。如果原始类型的所有值都可以用int类型表示,则其值将被转换为int类型;否则将被转换为unsigned int类型,这一过程称为整型提升。
unsigned char a = 0xF8;
unsigned char b = (~a)>>4;
unsigned char c = ~a;
c = c>>4;
unsigned char d = ((unsigned char)~a)>>4;
上面结果a=248,b=240,c=0,d=0,其中b的值不是所期望的,因为~a被整型提升到了int,然后右移4位,最后被转为unsigned char。
int i = -1;if(i < sizeof(i)) return true;else return false;
比较时i会被转换为unsigned int即0xffffffff,所以结果返回false。
3.static
static存储在静态数据区,经常在函数中使用静态局部变量记录一些数据,好处就是函数外不可见,而且其值一直是保存着的以便下次进入函数再次访问。但是要注意在多线程环境中这些static变量也是共享的,即可能同时被多个线程访问并修改,切记切记,因为这个原因悲剧的调试程序调了2天……
本文总结了编程中常见的几个陷阱:指针加减操作时需注意的实际地址偏移问题、整型提升导致的数据类型转换错误及多线程环境下static变量的共享问题。
8797

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



