程序里一些易犯错误

本文总结了编程中常见的几个陷阱:指针加减操作时需注意的实际地址偏移问题、整型提升导致的数据类型转换错误及多线程环境下static变量的共享问题。

        写程序时经常会遇见些莫名其妙的错误,往往花了大把时间找了很久的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天……


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值