strlen和sizeof比较以及static关键字介绍

news/2025/3/14 17:36:21/文章来源:https://www.cnblogs.com/fuhao2/p/18772388

1.0 strlen与sizeof的比较

  1. 定义与作用
strlen sizeof
是 <string.h> 中的库函数,计算字符串的实际长度(直到遇到 \0,但不包括 \0)。 是C语言的关键字(运算符),计算变量或类型占用的内存字节数(编译时确定)。
只能用于以 \0 结尾的字符串。 可用于任何数据类型(基本类型、数组、结构体等)。
  1. 关键区别
区别点 strlen sizeof
作用对象 仅字符串(char* 或字符数组)。 任意变量或类型。
空字符\0 忽略 \0 包含 \0 占用的空间(如果存在)。
执行时机 运行时计算。 编译时确定。
返回值类型 size_t(字符串实际字符数)。 size_t(变量/类型占用的总字节数)。
  1. 典型示例
  • 示例1:字符数组

char str[] = "Hello";
printf("strlen: %zu\n", strlen(str));  // 输出 5(不包含 \0)
printf("sizeof: %zu\n", sizeof(str));  // 输出 6(包含 \0,且数组总大小)
  • 示例2:指针与动态内存

char *p = "Hello";
char arr[10] = "Hello";
char *dynamic = malloc(100 * sizeof(char));printf("sizeof(p): %zu\n", sizeof(p));       // 输出指针大小(如 8 字节,64位系统)
printf("sizeof(arr): %zu\n", sizeof(arr));   // 输出 10(数组总大小)
printf("sizeof(dynamic): %zu\n", sizeof(dynamic)); // 仍为指针大小(如 8 字节)
  1. 联系与总结
  • 联系:两者均可用于字符数组,但关注点不同:

    • strlen 关注字符串内容的逻辑长度。

    • sizeof 关注变量/类型的物理内存占用。

  • 总结:

    • 需要字符串长度时用 strlen(确保字符串以 \0 结尾)。

    • 需要内存大小时用 sizeof(注意数组和指针的差异)。

  • 核心记忆点:

    • strlen 是“数字符”,sizeof 是“量内存”。

2.0 static 介绍

在C语言中,static 是一个重要的关键字,它的作用根据上下文不同而有多种含义。以下是 static 关键字的详细解析:

2.1 修饰局部变量(在函数内部)

void func() {static int count = 0; // 静态局部变量count++;printf("%d\n", count);
}
  • 作用

    • 生命周期:变量在程序运行期间一直存在(存储在静态存储区),即使函数退出也不会被销毁。
    • 初始化:只初始化一次(默认初始化为0)。
    • 作用域:仍只能在函数内部访问。
  • 示例
    调用 func() 多次,count 的值会持续递增(如第1次调用输出1,第2次输出2)。

2.2 修饰全局变量(在函数外部)

static int global_var = 10; // 静态全局变量void func() {printf("%d\n", global_var);
}
  • 作用
    • 作用域限制:将全局变量的作用域限定为当前源文件(.c文件),其他文件无法通过 extern 引用。
    • 避免命名冲突:常用于模块化编程,隐藏全局变量。

2.3 修饰函数

static void private_func() { // 静态函数printf("This is a static function.\n");
}
  • 作用
    • 作用域限制:函数只能在当前源文件中调用,其他文件无法访问。
    • 隐藏实现:防止其他文件调用内部函数,增强代码封装性。

2.4 核心区别与总结

场景 作用
局部变量 延长生命周期,保持值的持久性(不改变作用域)。
全局变量 限制作用域到当前文件,避免全局污染。
函数 限制函数作用域到当前文件,实现模块化。

2.5 典型应用场景

  1. 计数器:用静态局部变量统计函数调用次数。
  2. 单例模式:结合静态变量实现资源单例。
  3. 模块化设计:隐藏内部变量和函数,只暴露接口。
  4. 线程安全:静态变量在多线程中需谨慎使用(需加锁)。

2.6 注意事项

  • 默认初始化:静态变量(未显式初始化)会被自动初始化为0或 NULL
  • 不可重入性:静态局部变量可能导致函数不可重入(非线程安全)。
  • 内存占用:静态变量始终占用内存,直到程序结束。

2.7一句话总结

static 的三大用途:延长局部变量生命周期限制全局变量/函数作用域隐藏实现细节
核心本质:控制作用域和生命周期

2.8 特别的

场景 是否合法 作用
void func(static int param) ❌ 非法 语法错误,存储类说明符不可用于参数声明
void func(int arr[static 10]) ✅ 合法(C99) 提示编译器 arr 指向至少10个元素的数组

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/898772.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux中如何判断一个rpm是手动安装还是通过yum安装的

现状 对于一个不熟悉的服务器或者是虽然是自己的服务器,但历史比较久远,对于上面安装了的一些软件包,我们记忆都慢慢模糊了。 我今天遇到一个情况,在安装一个工具x2openEuler时,安装失败,提示依赖冲突: [root@VM-0-6-centos x2openeuler]# yum install x2openEuler-core…

如何让你的应用在市场中脱颖而出?

开发者在完成应用开发并成功上架应用市场后,将面临一项重要挑战:如何在竞争激烈的环境中脱颖而出,吸引用户的关注?为此,提升应用的曝光度和下载量至关重要。 HarmonyOS SDK应用市场服务(Store Kit)提供应用市场业务的对外开放能力,针对想要获得曝光的应用,Store Kit提…

阿里通义实验室语音团队负责人鄢志杰离职;苹果计划在 AirPods 上配备实时对话翻译功能丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 技术 」、「有亮点的 产品 」、「有思考的 文章 」、「有态度的 观点 」、「有看点的 活动 」,但内容仅代表编辑…

OP90-1工作原理

step1.压紧弹簧及产品 上下气缸压紧弹簧,产品压紧气缸压紧产品step2.弹簧钩下降 拉簧钩紧气缸伸出,带动弹簧钩下降step3.弹簧钩带动弹簧转动,下弹簧脚进槽step4.弹簧钩提起step5.弹簧钩旋转,带动弹簧越过高处,到达卡槽正上方step6.弹簧钩下降step.弹簧钩回退撤出 弹簧钩回…

Java的volatile和sychronized底层实现

1. 概览 从Java代码级别到硬件级别各层都是如何实现的2. Synchronized 2.1 字节码层面 使用javap -verbose <class文件>可以查看到字节码信息,其中synchronized方法会有flags:ACC_SYNCHRONIZED,此时字节码中不会包含monitorenter和moniotrexit,JVM会自动加 public syn…

信息资源管理文字题之“服务支持类的五大运营流程图”

一、为了充分利用ERP信息系统资源,LX集团采用了各种先进的信息系统管理理念和方法,包括IT服务管理,下图为LX集团IT服务管理中服务支持类的五大运营流程图 要求:将图中标有序号的空白处的正确能容,按序号填写 二、答案变更请求 最终软件库 配置管理数据库 影响分析 授权 变…

洛谷 P3979 遥远的国度 做题记录

ds。前置芝士:树链剖分 思路 我们先随手画出一张图:我们首先以 \(1\) 为根构造这颗树。 这张图比较特殊,因为这张图的编号同时也是他的 dfn 序。 我们将其分类讨论。设当前根节点为 \(rt\),查询的节点为 \(x\),那么:当 \(rt=x\) 时(图中蓝圈部分),我们可以访问所有的节…

actuator-系统监控功能

系统监控功能actuator-系统监控功能 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId> </dependency>application.yml server:port: 8080servlet:context-path: …

首页页面布局(1)

import { TaskItem } from ../view/TaskItemimport { TaskStatisties } from ../view/TaskStatisties@Entry@Componentstruct TaskList { @State message: string = Hello World build() { Stack({alignContent:Alignment.BottomEnd}){ Column() { // 第1个模…

算法备案承诺书指南,5分钟速览

算法备案承诺书是算法备案初审的重要文件,和《落实算法安全责任基本情况》是初审阶段难度最大的两份材料。今天我就结合过往经验总结下这份文件的要点,帮助大家快速理解。TIPS:不要照搬这份模板,仅供学习了解。也不要买模板!不同行业和不同服务形态、不同服务对象都有区别…

信创替代必看:禅道/ONES/Jira功能对比及迁移方案

信创项目管理工具:赋能企业数字化转型的利器 在这个数字化转型的浪潮中,项目管理工具成为了企业发展的关键。它们不仅帮助团队提高效率,还能推动创新,为企业带来更大的价值。今天,让我们一起探索这些工具的魅力,以及它们如何在信创领域大放异彩。 项目管理工具的重要性 项…

VK1650 SOP16LED显示驱动芯片,适用于小家电,电磁炉,微波炉等

产品品牌:永嘉微电/VINKA 产品型号:VK1650 封装形式:SOP16/DIP16 概述 VK1650是一种带键盘扫描电路接口的 LED 驱动控制专用芯片,内部集成有数据锁存器、LED 驱动、键盘扫描等电路。SEG脚 接LED阳极,GRID脚接LED阴极,可支持8SEGx4GRID的点阵 LED显示。最大支持7x4按键。本…