博客
关于我
sizeof与strlen的区别
阅读量:606 次
发布时间:2019-03-12

本文共 2101 字,大约阅读时间需要 7 分钟。

sizeof与strlen:区别与应用

sizeofstrlen是C语言中的两个核心工具,虽然都与内存有关,但使用场景、作用不同,理解它们的区别对于提升代码编写能力至关重要。本文将深入探讨这两个工具的功能、用法以及适用场景。

sizeof的作用

sizeof是一个编译时的关键字,其作用是获取内存中某一块内存区域所占的字节数。它的使用对象包括:

  • 类型:通过typeof表达式,sizeof可以返回数据类型所占的字节数。例如:

    sizeof(int); // 返回int类型的大小

    注意:括号的使用:sizeof后面如果是类型,必须使用括号,如sizeof(char), 否则解析器会将其误解为 sizeof以后的标识符。

  • 变量/数组sizeof也可以用来获取变量或数组的内存大小。例如:

    int arr[100];sizeof(arr); // 返回整个数组的内存大小,即100个int的总量sizeof(*arr); // 返回一个int的大小arr[50] = 100;sizeof(arr); // 返回的结果仍为100,因为排量没有变化

    需要注意的是,数组的传递方式是按值传递,排量是编译时确定的,动态分配的内存大小sizeof无法测量。

  • 指针sizeof(ptr)返回指针所在的内存单元大小。对于32位系统,返回4字节;64位系统,返回8字节。例如:

    char *ptr = "hello";sizeof(ptr); // 返回4(如32位系统)

    但如果用于获取指针指向的数据大小,需要使用*ptr,例如:

    char *ptr = "hello";sizeof(*ptr); // 返回1(字符类型的大小)
  • 函数的返回类型sizeof可以用于测量函数返回值的类型大小,前提是返回值类型不能是void。例如:

    int func_return值返回了int类型;sizeof(func_return值) // 返回4(32位系统)或8(64位系统)

    需要注意的是,函数返回值的实际大小在运行时可能根据 optimizations而不同,经常会被编译器优化。

  • strlen的作用

    strlen是一个库函数,运行时使用,功能是计算字符串的实际长度(从非零结尾字符'\0'的位置开始到'\0'的距离的总数)。它所在的头文件是<string.h>,函数原型为:

    unsigned int strlen(char *s);

    有几个重要的特点:

  • 只计算到'\0'strlen的作用是返回从字符串起点到第一个'\0'之前的字符数。需要注意的是,如果字符串没有'\0'终止符,strlen将漫无止境地遍历内存,直到碰到一个无法访问的区域,导致程序崩溃。
  • 依赖编译器优化strlen函数的实现通常很简单,一般是逐字符递增加指针直到遇到0位。但编译器和解析器通常对字符串常量的处理非常高效。
  • 必须使用char*类型strlen的参数必须是char *类型。传递其他类型的指针会导致编译错误。
  • 注意事项

  • strlen的作用域依赖strlen无法用于测量内存的大小,仅仅测量字符串存储的数据量,但需要注意字符串是否附带了'\0'终止符。

  • 数组与字符串的区别

    char string[] = ".hello";char *s = "hello\0";

    使用strlen测量数组存储的数值,还是只能看终止符是否到位。

  • 不同的使用场景

    • 当需要知道内存分配的大小时,必须使用sizeof,而不是strlen
    • 当需要计算确切的字符串数据长度时,必须使用strlen
    • 如果变量或数据没有依赖'\0'终止符(如动态内存分配),则无法使用strlen测长度。
  • 例子解析

  • 例1

    char str[20] = "0123456789";int a = strlen(str); // a = 10int b = sizeof(str); // b = 20
    • strlen测字符串的实际长度,而sizeof测内存分配的大小,包括导致'\0'的位置所占的字节数。
  • 例2

    char *ss = "0123456789";int i = sizeof(ss); // i = 4int j = sizeof(*ss); // j = 1int k = strlen(ss); // k = 10
    • 用于指针测大小时,ss是位于100号段的指针,sizeof(ss)测的是指针本身占用的内存大小,而每个字符的大小可以用*ss测得。
  • 例3

    char buffer[] = "Hello";int m = strlen(buffer); // m = 5int n = sizeof(buffer); // n = 6
    • 元数组buffer中的所有字节都已包含0,使得parseInt较为直观。
  • 常见误区

  • 混淆大小与实际内容
    char s[] = "abc";int n = sizeof(s); // n = 4?!或者3?

    实际上不管内容是多少,s是数组,其大小是4字节(如果是字典序)。strlen(s)返回3,但除了终止符之外

  • 转载地址:http://okxxz.baihongyu.com/

    你可能感兴趣的文章
    localhost:5000在MacOS V12(蒙特利)中不可用
    查看>>
    logstash mysql 准实时同步到 elasticsearch
    查看>>
    Luogu2973:[USACO10HOL]赶小猪
    查看>>
    mabatis 中出现&lt; 以及&gt; 代表什么意思?
    查看>>
    Mac book pro打开docker出现The data couldn’t be read because it is missing
    查看>>
    MAC M1大数据0-1成神篇-25 hadoop高可用搭建
    查看>>
    mac mysql 进程_Mac平台下启动MySQL到完全终止MySQL----终端八步走
    查看>>
    Mac OS 12.0.1 如何安装柯美287打印机驱动,刷卡打印
    查看>>
    MangoDB4.0版本的安装与配置
    查看>>
    Manjaro 24.1 “Xahea” 发布!具有 KDE Plasma 6.1.5、GNOME 46 和最新的内核增强功能
    查看>>
    mapping文件目录生成修改
    查看>>
    MapReduce程序依赖的jar包
    查看>>
    mariadb multi-source replication(mariadb多主复制)
    查看>>
    MariaDB的简单使用
    查看>>
    MaterialForm对tab页进行隐藏
    查看>>
    Member var and Static var.
    查看>>
    memcached高速缓存学习笔记001---memcached介绍和安装以及基本使用
    查看>>
    memcached高速缓存学习笔记003---利用JAVA程序操作memcached crud操作
    查看>>
    Memcached:Node.js 高性能缓存解决方案
    查看>>
    memcache、redis原理对比
    查看>>