本文共 2137 字,大约阅读时间需要 7 分钟。
未完待续
问题1:sizeof是关键字么?
sizeof是数据类型的关键字,而非函数。
引申:预处理指令是否是C语言中的语言类型?
不是。C语言中的语言类型一共有以下5种:
(1)表达式语句
(2)函数调用语句
(3)控制语句
(4)复合语句
(5)空语句
注意:由于预处理指令的结尾不能添加分号,所以预处理指令不是语句
问题2:strlen("\0") = ? sizeof("\0") = ?
strlen("\0") = 0, sizeof("\0") = 2
执行的是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,知道碰到第一个字符串结束符‘\0’为止,然后返回计数器值。
是C语言的关键字,它以字节的形式给出了其操作数的存储大小,操作数可以是一个表达式或括在括号内的类型名,操作数的存储大小由操作数的类型决定。
两者区别:
在C++里参数传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小,如果想在函数内知道数组的大小,需要这样做:进入函数后用memcpy复制出来,长度由另一个形参传进去。
sizeof关心的是编译期为其分配的空间大小不关心里面存了多少数据。
strlen只关心存储的数据内容,不关心空间的大小和类型。
问题3:对于结构体而言,为什么sizeof返回的值一般大于期望值?
在默认情况下,编译器为每一个变量或数据单元按其自然对界条件分配空间。一般地,可以通过下面的方式来改变默认的对界条件:
(1)使用伪指令#pragma pack(n),C编译器将按照n个字节对齐
(2)使用伪指令#pragma pack(n),取消自定义字节对齐方式
(3)_attribute((aligned(n))),让所作用的结构成员对齐在n字节自然边界上。如果结构中有成员长度大于n,则按照最大成员的长度来对齐。_attribute((packed)),取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。
字节对齐的细节和编译器实现相关,但一般而言,满足一下3个准则:
(1)结构体变量的首地址能够被其最宽基本类型成员的大小所整除
(2)结构体每个成员相随与结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节
(3)结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节
需要注意的是:
基本类型是指像char、short、int、float、double等内置数据类型,所谓“数据宽度”就是指其sizeof的大小,32位机器上,这些基本数据类型的sizeof分别是1、2、4、4、8。
问题4:指针进行强制类型转换后与地址进行加法运算,结果是什么?
已不再是指针加法,而变成一个数值加法。
转载地址:http://dfvti.baihongyu.com/