sizeof是编译期,由编译器进行语法分析的时候得出来的结果值,不生成任何机器指令
代码验证看下如下代码:
#includestruct sdshdr { int len; int free; char buf[]; }; int main(void) { printf("%dn", sizeof(struct sdshdr)); return 1; }
执行编译:
gcc -S -m32 -fno-asynchronous-unwind-tables demo.c
编译后的汇编代码如下:
.file "demo.c"
.section .rodata
.LC0:
.string "%dn"
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $16, %esp
movl $.LC0, %eax
movl $8, 4(%esp)
movl %eax, (%esp)
call printf
movl $1, %eax
leave
ret
执行的结果是8(两个int):
[]$ gcc demo.c []$ ./a.out 8
这里说明buf[]没有指定,这时候编译器不会计算进去
sizeof 和strlen不管是sizeof,还是strlen,都是在编译器算出来的。
1、c代码:
#include#include int main(void) { printf("%dn", sizeof("hello")); printf("%dn", strlen("hello")); return 1; }
执行编译:
gcc -S -m32 -fno-asynchronous-unwind-tables demo1.c
编译后的汇编代码如下:
.file "demo1.c"
.section .rodata
.LC0:
.string "%dn"
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $16, %esp
movl $.LC0, %eax
movl $6, 4(%esp)
movl %eax, (%esp)
call printf
movl $.LC0, %eax
movl $5, 4(%esp)
movl %eax, (%esp)
call printf
movl $1, %eax
leave
ret
从汇编代码可以看出,sizeof的结果是6,strlen的结果是5。
为什么呢?因为c语言中,字符串需要以’ ’结尾,所以sizeof计算的时候需要加上结尾符,所以是6。但是strlen是计算实际字符串的长度。所以是5。



