sizeof
sizeof不是一个函数,字节数的计算在程序编译时进行,通过下面这个例子可以证明这一点
// test.c
#include <stdio.h>
int main(){
int a = sizeof 1;
return 0;
}
# 编译但不链接test.c文件
gcc -c test.c -o test.o
# 反汇编查看test.o
objdump -d test.o
00000000 <main>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 ec 10 sub $0x10,%esp
6: c7 45 fc 04 00 00 00 movl $0x4,-0x4(%ebp)
d: b8 00 00 00 00 mov $0x0,%eax
12: c9 leave
13: c3 ret
- 为避免麻烦,使用sizeof最好加上括号。
- 根据sizeof我们可以引出指针和数组的不同,当a分别为10字节字符数组和字符串指针时,sizeof(a)分别返回10和4,也就是数组名并不是纯粹意义上的指针,数组是C语言必不可少的内建类型。
- 对数组只有两种特殊操作——得到数组的大小和确定数组各位置的指针,而其它所有操作都可以转换为对应的指针操作。
- sizeof空结构体不为0,结果为多少由编译器决定,但实际在内存中不占位置,只是为了表明这里有变量占用。
struct test1_1{
double test1_2;
char test1_3;
struct test1_1 *test1_4;
}*test1_5;
printf("%d\n",sizeof(test1_5));
double test1_6=3.0,*test1_7;
test1_7=&test1_6;
double test1_8[3]={1,2,3};
printf("%d\n",sizeof(test1_7));
printf("%d\n",sizeof(test1_8));
/**
* output
* 8
* 8
* 24
*/
sizeof与strlen
char str[6]="12";
printf("%d %d\n",sizeof(str),strlen(str));
/**
* output
* 6 2
*/