C语言sizeof的用法及注意事项
求普通变量的大小
#include <stdio.h>
int main()
{
int a = 5;
printf ("%d\n", sizeof(a)); //4 计算a所占空间的大小,单位是字节
printf ("%d\n", sizeof (int)); //4 计算int类型的大小
printf ("%d\n", sizeof a); //4 可以省略括号,说明sizeof是一个操作符,不是函数
return 0;
}
求数组的大小
#include <stdio.h>
int main()
{
int arr[10]= { 0 };
printf ("%d\n" , sizeof(arr)); //40,单位是字节
printf ("%d\n", sizeof(int[10])); //40, int[10]是arr数组的类型
return 0;
}
特殊例子:
#include <stdio.h>
int main()
{
short s =5;
int a = 10;
printf ( "%d \n", sizeof(s = a + 2)); //结果为:2
printf ( "%d \n", s); //结果为:5
return 0;
}
解释:因为sizeof括号中的表达式是不参与运算的! 源文件在变成可执行文件过程中,经过预处理,编译,汇编,链接,sizeof在编译中就判断了s的大小,给出值为2,并且表达式不参与运算,而printf函数是在运行的时候再执行的,所以直接打印出2,和下面s变量的值5
sizeof计算指针
#include <stdio.h>
void test1(int arr[])
{
printf("%d\n",sizeof(arr)); // 4/8 -> 指针的大小
}
void test2(char ch[])
{
printf("%d\n",sizeof(ch)); // 4/8 -> 指针的大小
}
int main()
{
int arr[10] = {0};
char ch[10] = {0};
printf("%d\n", sizeof(arr)); //40
printf("%d\n", sizeof(ch)); //10
test1(arr);
test2(ch);
return 0;
}
用sizeof求数组大小时要注意,当数组被当作参数传递过去时,传过去的是数组的首元素的地址,因为是地址,所以用指针来接收,所以函数里面用sizeof求的都是指针的大小,不是数组,32位平台下都是4字节,64位平台下都是8字节
strlen与sizeof的区别
strlen -函数:求字符串长度的,找’\0’之前出现的字符个数
sizeof -操作符:算变量/类型所占内存大小,单位是字节
sizeof的返回类型
#include <stdio.h>
int i; //i是全局变量,不初始化,默认是0
int main ()
{
i--; //-1
if (i > sizeof(i))
{
printf ( "> \n" );
}
else
{
printf ("<\n");
}
return 0;
}
这个例子的输出结果是>,sizeof这个操作符,算出的结果的类型是unsigned int,因为大小是没有负数的,当进行 i > sizeof(i) 比较时,会把有符号的 i 算术转换为无符号,因为-1在内存中全1存储,变为无符号后原码补码一样,将会是一个很大的数,肯定比4字节大,所以输出>