7.3 sizeof关键字

来源:互联网 发布:mysql默认引擎 编辑:程序博客网 时间:2024/06/15 14:05

7.3.2 strlen和sizeof

strlen是从内存某个位置开始扫描,直到\0截止的字符个数。strlen("\0")==0;

sizeof是 C语言关键字,以字节形式返回操作数的存储大小。

操作数可以是表达式或在括号里的类型名,存储大小根据类型决定。

strlen和sizeof的区别:

1.strlen是函数,sizeof后面是类型名加括号,是变量则不需加括号。

2.sizeof的结果是size_t,在头文件中被 typedef为unsigned int,能够保证容纳所建立的最大对象的字节大小。

3.数组名作为sizeof的参数时,不退化为指针,得到的是数组整体的大小。

4.大部分sizeof是在编译器期间计算出来的,strlen则全是在运行期间。

5.strlen只能用char*做参数,必须以\0结尾。

6.通常C语言写法:

  fun(unsigned char* i,int length){

     unsigned char*buf =new unsigned char[length+1];

    memcpy(buf,i, len);

    buf[length+1]='\0';

}

注意:指针sizeof通常为4B。


7.3.3对于结构体,为什么sizeof返回值要一般大于期望值

struct的sizeof是所有成员对齐后的结果,union 是取最大成员长度。

struct安装成员被声明的顺序分配内存地址,并且运用 字节对齐,即在可接受的空间浪费下,提高cpu读取速度。因为cpu每次读取一个32位(64位,机器字长)。

通过三种方法可以改变对齐字节:

1.#pragma pack(n)按n字节对齐。

2.#pragma pack()取消对齐

3._attribute((aliged(n))),按n对齐。

最小化结构体,根据最大的成员长度,进行声明顺序调整。比如 short,short,int只占8字节,而short,int,short占12字节。

常见的char,short ,int,float,double占1,2,4,4,8;


7.3.4指针强制转换后与地址加法运算,结果是?

注意:指针指向同一数组,可以相减,得到相差距离,如&a[8]-&a[0]=8;

书中例子所示,struct BBB*p;p+1实际就是p地址+1*sizeof(BBB);p+0x200==p+0x200*sizeof(BBB)==p+0x200*24;

(char*)p+0x200==p+0x200*4;

(long)p+0x200已经变成数字运算了。














0 0
原创粉丝点击