
sizeof是C语言的关键字,用于计算当前系统中变量(或数据类型)占用的内存字节数.
sizeof不是函数,因为sizeof确实有点像一个函数,所以出现了这样一个问题sizeof计算结构体大小,sizeof有两种写法:
对于数据类型
sizeof(数据类型);
数据类型必须放在方括号中.

printf("字符型变量占用的内存是=%d\n",sizeof(char)); // 输出:字符型变量占用的内存是=1
printf("整型变量占用的内存是=%d\n",sizeof(int)); // 输出:整型变量占用的内存是=4
对于变量
sizeof(变量名);
sizeof 变量名;
变量名可以用括号括起来. 括号的使用更为常见. 大多数程序员都使用这种形式.
int ii;
printf("ii占用的内存是=%d\n",sizeof(ii)); // 输出:ii占用的内存是=4
printf("ii占用的内存是=%d\n",sizeof ii); // 输出:ii占用的内存是=4

理论上,结构的每个成员都连续存储在内存中,这与数组非常相似. 但是,结构占用的内存总大小不一定等于所有成员变量占用的内存总和. 在编译器的特定实现中,为了提高内存寻址的效率,各个成员之间可能会有间隙. 使用sizeof可以获取结构占用的总大小,即sizeof(结构名称)或sizeof(结构变量名称).
示例(book90.c)
/*
* 程序名:book90.c,此程序用于演示C语言的结构体占用内存的情况
* 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#include <stdio.h>
// #pragma pack(1) # 告诉编器内存按1字节对齐。
struct st_girl
{
char name[50]; // 姓名
int age; // 年龄
int height; // 身高,单位:厘米cm
char sc[30]; // 身材,火辣;普通;飞机场。
char yz[30]; // 颜值,漂亮;一般;歪瓜裂枣。
};
int main()
{
struct st_girl queen;
printf("sizeof(struct st_girl) %d\n",sizeof(struct st_girl));
printf("sizeof(queen) %d\n",sizeof(queen));
}
运行效果


从上面的示例中可以看到,struct st_girl的所有成员变量占用的内存为50 + 4 + 4 + 30 + 30 = 118,但是结构占用的内存为120.
请注意,C语言提供了一种对齐结构成员内存的方法sizeof计算结构体大小,因此,在结构成员变量的内存之间没有间隙,只需启用#pragma pack(1)代码即可.
printf("sizeof(void)=%d\n",sizeof(void)); // 输出sizeof(void)=1
上面的代码在某些编译器中可能不会通过.
void是无值或空类型. 存储空间的类型未知,并且编译器无法确定其大小. void无法声明变量,无法编译以下代码:

void vv;
但是以下代码正确:
void *pv;
printf("sizeof(void*)=%d\n",sizeof(pv)); // 输出sizeof(void)=8
pv是一个空指针. 在64位操作系统中,指针变量占用的内存大小为8,这与下面相同.
如果将字符串的地址(例如char strname [21])传递给子函数,则子函数将使用字符指针(例如char * pstr)来存储输入字符串的地址(如果位于)子函数sizeof(pstr)的值不是字符串所占用的内存字节数,而是字符指针变量所占用的内存字节数(8字节).
因此,除非字符串的长度也作为参数传递到子函数中,否则无法在子函数中初始化传入的字符串.
如果将结构(例如struct st_girl stgirl的结构)的地址传递给子函数,则子函数将使用结构指针(例如struct st_girl * pgril)存储传入结构的地址(如果它位于子函数sizeof(pgirl),不是结构占用的内存字节数,而是结构指针变量占用的内存字节数(8个字节). 正确的用法是使用sizeof(struct st_girl).
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-195062-1.html
Nice
这就是博弈