”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 为什么 C 中基于指针和基于数组的字符串的“strlen”和“sizeof”产生不同的结果?

为什么 C 中基于指针和基于数组的字符串的“strlen”和“sizeof”产生不同的结果?

发布于2024-11-16
浏览:211

Why do `strlen` and `sizeof` produce different results for pointer-based and array-based strings in C?

基于指针和基于数组的字符串初始化的字符串长度和大小计算的不同输出

了解结果

当创建具有相同值的基于指针的字符串 str1 和基于数组的字符串 str2 时,函数 strlen 和 sizeof 产生不同的结果。具体来说,对于声明:

char *str1 = "Sanjeev";
char str2[] = "Sanjeev";

strlen 对于 str1 和 str2 都返回 7,因为它测量字符序列的长度,不包括末尾的空终止符 (\0)。

然而,sizeof 产生不同的值:

  • sizeof(str1) 返回 4,因为它计算指针变量的大小,即通常为 4 个字节(32 位系统)。
  • sizeof(str2) 返回 8,因为它确定数组的大小,其中包括空终止符,从而产生 8 个字节(7 个字符 1 个空终止符) .

根本区别:数据类型与内存分配

sizeof 测量数据类型的大小数据类型,而 strlen 测量字符序列的长度。对于str1,它是一个指向char的指针,因此sizeof返回指针的大小。对于 str2,它是一个字符数组,因此 sizeof 返回整个数组的大小,包括空终止符。

仔细查看

来演示更好区分,考虑:

char str2[8];
strncpy(str2, "Sanjeev", 7);
char *str1 = str2;

现在,str1和str2都指向同一个数组。它们的 strlen 值为 7,但它们的 sizeof 值不同:

  • sizeof(str1) 为 4(指针大小)
  • sizeof(str2) 为 8(带有空终止符的数组大小) )

这举例说明了大小评估如何取决于基础数据结构。

最新教程 更多>
  • Python 请求如何使用 Javascript 处理动态网站?
    Python 请求如何使用 Javascript 处理动态网站?
    克服 Python 请求的 Javascript 障碍传统的 Python 请求旨在从静态 HTML 页面中提取信息。然而,许多现代网站使用 Javascript 来动态获取数据,这给 Requests 带来了挑战。是否有一种解决方法可以利用 Javascript 页面的 Requests ?绝对可...
    编程 发布于2024-11-16
  • 在 Go 中使用 WebSocket 进行实时通信
    在 Go 中使用 WebSocket 进行实时通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    编程 发布于2024-11-16
  • 如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 识别今天生日的用户使用 MySQL 确定今天是否是用户的生日涉及查找生日匹配的所有行今天的日期。这可以通过一个简单的 MySQL 查询来实现,该查询将存储为 UNIX 时间戳的生日与今天的日期进行比较。以下 SQL 查询将获取今天有生日的所有用户: FROM USERS ...
    编程 发布于2024-11-16
  • 从本地主机到生产:OneBootcamp 的问题优先 SRE 之旅
    从本地主机到生产:OneBootcamp 的问题优先 SRE 之旅
    我在 X(以前的 Twitter)上遇到了 One2N 举办的一个问题优先的 SRE 训练营(在这里你可以构建一个应用程序,并将其从本地主机扩展到生产环境),我想,“哎呀是啊!我会尝试一下。”这篇博文开启了我的旅程,我将记录我在训练营中处理每项练习的经验。 这篇介绍性文章将链接到其他条目,详细介绍我...
    编程 发布于2024-11-16
  • 大批
    大批
    方法是可以在对象上调用的 fns 数组是对象,因此它们在 JS 中也有方法。 slice(begin):将数组的一部分提取到新数组中,而不改变原始数组。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index p...
    编程 发布于2024-11-16
  • Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta:列偏移的删除和恢复Bootstrap 4 在其 Beta 1 版本中引入了重大更改柱子偏移了。然而,随着 Beta 2 的后续发布,这些变化已经逆转。从 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    编程 发布于2024-11-16
  • 如何在Python中递归搜索子文件夹并检索文件?
    如何在Python中递归搜索子文件夹并检索文件?
    递归子文件夹搜索和文件检索在编程领域,遍历目录和检索文件可能是一项常见任务。一种有效的方法是采用递归算法搜索子文件夹并累积满足特定条件的文件列表。遇到的问题用户遇到了障碍尝试在递归子文件夹搜索中构建特定文件的列表时。该问题源于子文件夹变量拉入子文件夹列表而不是包含该文件的当前文件夹。子文件夹的用途子...
    编程 发布于2024-11-16
  • 如何使用 CSS 构建倒计时器
    如何使用 CSS 构建倒计时器
    Written by Carlos Mucuho✏️ Countdown timers are a popular feature on many websites, enhancing functionality for events, sales, and user engagement. Wh...
    编程 发布于2024-11-16
  • ## 像素完美缩小可以在浏览器大小调整期间保存图像质量吗?
    ## 像素完美缩小可以在浏览器大小调整期间保存图像质量吗?
    通过缩小尺寸重新采样会降低图像质量?此处的目标是减小图像的大小,同时在浏览器环境中保持其质量。使用 HTML5 画布缩小图像时会出现此问题,导致图像质量下降。缩小尺寸与插值缩小尺寸和插值是不同的技术。缩小是指通过组合源图像中的像素以在目标图像中创建更少的像素来减小图像尺寸,而插值是指在放大时在目标图...
    编程 发布于2024-11-16
  • Python 3.x 的 super() 函数在没有参数的情况下如何工作,有哪些潜在的陷阱以及如何避免它们?
    Python 3.x 的 super() 函数在没有参数的情况下如何工作,有哪些潜在的陷阱以及如何避免它们?
    揭开Python 3.x神奇Super()的秘密Python 3.x引入了super()函数的一个特殊方面:可以在没有参数的情况下调用它。这种看似平凡的行为隐藏了编译时魔法和运行时支持的强大组合,提供了巨大的灵活性和效率。隐藏的编译时魔法通过无参数的 super() 调用,Python 编译器在编译...
    编程 发布于2024-11-16
  • PHP如何将变量转换为字符串?
    PHP如何将变量转换为字符串?
    PHP中的字符串转换Java和.NET程序员可能习惯toString()方法,它提供了一种便捷的转换方式任何对象到字符串表示形式。 PHP 通过转换运算符提供类似的功能。PHP 的转换运算符要将 PHP 变量转换为字符串,可以使用 (string) 转换运算符。此语法允许您将任何类型的变量显式转换为...
    编程 发布于2024-11-16
  • 如何修复“无法将 MySQL 日期/时间值转换为 System.DateTime”错误?
    如何修复“无法将 MySQL 日期/时间值转换为 System.DateTime”错误?
    了解“无法将 MySQL 日期/时间值转换为 System.DateTime”错误从 MySQL 数据库检索数据有时会导致错误“无法将 MySQL 日期/时间值转换为 System.DateTime”。当从数据库检索的数据的 DbType 与 .NET 数据类型的相应属性不兼容时,就会出现这种情况。...
    编程 发布于2024-11-16
  • 如何使用 PDO 准备语句将多行插入数据库?
    如何使用 PDO 准备语句将多行插入数据库?
    使用 PDO 准备好的语句插入多行使用单个准备好的语句将多行插入数据库不仅是可能的,而且推荐用于它的效率和安全性。单个插入的方法查询第一种方法涉及使用具有多个值的单个 INSERT 查询:INSERT INTO Table (col1, col2, col3) VALUES ('abc', 'de...
    编程 发布于2024-11-16
  • Java中如何计算两个日期之间的天数?
    Java中如何计算两个日期之间的天数?
    在 Java 中计算两个日期之间的天数在 Java 编程语言中,计算两个日期之间的天数可以很简单任务。但是,当日期存储为字符串时,需要仔细转换才能准确处理它们。将字符串日期转换为日期对象要有效地处理日期,您可以将它们从字符串转换为 Date 或 LocalDate 类型。 Java 提供了各种类和方...
    编程 发布于2024-11-16
  • 如何使用“...”标记在 C++ 可变参数模板中打包和解包参数?
    如何使用“...”标记在 C++ 可变参数模板中打包和解包参数?
    可变参数模板中“...”标记的语法规则在 C 中,可变参数模板可以构造接受参数数量可变。 “...”标记在此上下文中起着至关重要的作用,充当参数包或参数解包器。省略号放置的语法规则The “...”标记的位置决定了其功能:Pack: 当它出现在名称的左侧时,“...”表示参数包: ...thing ...
    编程 发布于2024-11-16

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3