avatar
关于sizeof

关于sizeof

星期三,七月 9 日,2014 年

前两天犯了一个愚蠢的错误,由于对sizeof理解的错误,导致代码出现了一个bug,具体代码逻辑如下: char buf[512]; char *ptr; int size; ptr = buf; size = sizeof(ptr); 本来是计算buf的大小,但这样写其实只是得到 char指针类型的大小,错误的以为ptr指向buf时,用sizeof获取的也是buf的大小。通过了解,如果sizeof的操作数为指针时,不管指针指向什么类型,值都是指针类型的大小,32位系统为4.具体sizeof的结果如下: 1、当操作数为数据类型时,所得结果为给数据类型的大小。如:32bit系统上,sizeof(char)= 1 ,sizeof(int) = 4。 2、当操作数是指针时,sizeof依赖于编译器。例如Microsoft C/C++7.0中,near 类指针字节数为2,far、huge类指针字节数为4。一般Unix的指针字节数为4。 3、当操作数具有数组类型时,其结果是数组的总字节数。 4、联合类型操作数的sizeof是其最大字节成员的字节数。结构类型操作数的 sizeof是这种类型对象的总字节数,包括任何垫补在内。 让我们看如下结构: struct { char b; double x; } a; 在某些机器上sizeof(a)=12,而一般sizeof(char)+ sizeof(double)= 9。 这是因为编译器在考虑对齐问题时,在结构中插入空位以控制各成员对象的地址对 齐。如double类型的结构成员x要放在被4整除的地址。 5、如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。
@ 归零
1 分钟阅读
内存死机问题

内存死机问题

星期一,三月 10 日,2014 年

最近遇到一个内存导致死机的问题,这种问题总是让人很恼火。 Mstar linux方案,由于对指针的检测不够完善,导致使用了空指针。一个问题整了我一天多时间, 最后查出来尽然是珠海有线的码流里边有一个bouquet id是 -256,而代码里边没有处理到这种情况,获取到空指针, 而在使用的时候又没有检测。幸亏有gdb可以用,可以定位到是那个模块出了问题。完了想想本来这个问题要不 了那么长时间,一开始感觉这个变量有点问题,可就被脑子里那种 “不可能这儿出问题啊"的想法打消了,也许 很多程序员会犯这种错误,总是很确信的说"这个不可能”,难道这个真的不可能吗?其实自己也不知道,不知道 从哪儿来的这种莫名其妙的自信。 由这个问题想到: 1)不要轻易做任何假设,负责可能会影响你做出准确的判断。 2)时时刻刻在使用指针时要检测是否为空,这个构建健壮软件的必要条件。 3)要让程序能经得起一些意味发生的情况,比如获取到错误变量等。
@ 归零
1 分钟阅读

© 2014 - 2022 Lionel's Blog

Powered by Hugo with theme Dream.