栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

06C语言sizeof strlen编译期函数

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

06C语言sizeof strlen编译期函数

sizeof

sizeof是编译期,由编译器进行语法分析的时候得出来的结果值,不生成任何机器指令

代码验证

看下如下代码:

#include 

struct 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。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/938148.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号