在C语言中sizeof()是一种单目操作符,用于表示相关数据的字节个数,并非是函数;编译器在进行转汇编之前就已经对其处理,将sizeof(type)计算为一个常数。所以sizeof(type)等同于一个常数。
比如:“int a=sizeof(int);"与“int a=4;”在汇编和机器码上是一模一样的。所以,在嵌入式中如果有人想通过用常数替换sizeof(type)来降低软件负载,可就白费力气了。
下面为大家归纳一下sizeof(type)的使用规则:
sizeof(数据类型):表示该类型长度
sizeof(char)=1; sizeof(unsigned char)=1;
sizeof(short int)=2 ;sizeof(int)=4; sizeof(unsigned int)=4; sizeof(unsigned long long)=8;
sizeof(float)=4; sizeof(double)=8;
sizeof(结构体类型):表示该结构体长度(字节数)。
如下代码,执行结果为“3”。
struct test
{
char a;
char b;
char c;
};
int main(void)
{
printf("%d\n", sizeof(struct test));
}
注意:结构体长度不一定等于所有类型长度和,结构体的长度必须为最大长度成员的倍数,且首个元素地址必须与最大长度的元素按照最大长度对齐。
如下代码,执行结果为“12”,结构体成员b长度最大,为4字节,所以结构体大小为4的倍数,且变量a、b的地址也必须是4字节对齐。
struct test
{
char a;
int b;
char c;
};
int main(void)
{
printf("%d\n", sizeof(struct test));
}
如下代码,执行结果为“24”,8字节对齐。
struct test
{
char a;
int b;
long long c;
char d;
};
int main(void)
{
printf("%d\n", sizeof(struct test));
}
sizeof(共用体体类型):表示共用体中最大数据类型的长度(字节数)。
如下代码,执行结果为8,因为共用体Test中数据类型长度最大的long long类型为8。
union Test
{
char a;
short int b;
int c;
long long d;
};
int main(void)
{
printf("%d\n", sizeof(union Test));
}
sizeof(变量名):表示该变量的长度。
如下代码,执行结果为“1,4,8”。
int main(void)
{
char a;
int b;
long long c;
printf("%d,%d,%d\n", sizeof(a), sizeof(b), sizeof(c));
}
sizeof(一维数组名):表示该一维数组所占字节数。
如下代码,执行结果为“10,40,80”。
int main(void)
{
char a[10];
int b[10];
long long c[10];
printf("%d,%d,%d\n", sizeof(a), sizeof(b), sizeof(c));
}
sizeof(二维数组名):表示该二维数组所占字节数。
如下代码,执行结果为“20,80,160”。
int main(void)
{
char a[10][2];
int b[10][2];
long long c[10][2];
printf("%d,%d,%d\n", sizeof(a), sizeof(b), sizeof(c));
}
取列指针,如下代码,执行结果为“2,8,16”,表示每行的字节数。
int main(void)
{
char a[10][2];
int b[10][2];
long long c[10][2];
printf("%d,%d,%d\n", sizeof(a[0]), sizeof(b[0]), sizeof(c[0]));
}
sizeof(函数):表示该函数返回值的长度。
如下代码,执行结果为“0,1,4”。
void test1(){return;}
char test2(){return 1;}
int test3(){return 1;}
int main(void)
{
printf("%d,%d,%d\n", sizeof(test1()), sizeof(test2()), sizeof(test3()));
}
sizeof(字符串):表示该字符串加空字符的长度。
如下代码,执行结果为“9”,共8个非空字符和1个空字符。
int main(void)
{
printf("%d\n", sizeof("01234567"));
}
sizeof(指针变量):表示指针的长度,与平台地址长度有关。
如下代码,如果在32位PC机上,地址p为32位,执行结果为“4”。如果在62位PC机上,地址p为64位,执行结果为“8”。
int main(void)
{
char a[10];
char *p = a;
printf("%d\n", sizeof(p));
}
应用实例
例1:如下代码,执行结果为“4”,可以灵活获取表格长度;
#include
struct test
{
int Index;
char a[10];
};
struct test Test[]=
{
{1,"测试1"},
{2,"测试2"},
{3,"测试3"},
{4,"测试4"}
};
unsigned int iNum = sizeof(Test)/sizeof(struct test);
int main(void)
{
printf("%d\n", iNum);
}