首页 > 文章列表 > 空字符串和零长度数组:我们如何存储...什么都没有?

空字符串和零长度数组:我们如何存储...什么都没有?

300 2025-01-27

空字符串和零长度数组:我们如何存储...什么都没有?

在Python和JavaScript等高级语言中,我们非常习惯像这样初始化字符串和数组:

让 myStr = ""; // 一个空字符串
让 myArr = []; // 一个空数组

我们说这些是空的,这意味着它们包含零字节的数据。那么我们存储的是零字节数据?啊?这是自相矛盾的废话吗?

不存储任何内容

空数组或字符串不包含任何元素或字符,但它存在。这感觉就像带着一个看不见的、毫无重量的手提箱一样矛盾。但我们如何理解这一点呢? 鼓声 其实,它并不是真的空。

字符串:C 语言视角

为了解开这个谜团,让我们一起走进C编程的世界吧。在 C 中,字符串通常被处理为以空字符 (' ') 结尾的字符数组。但是当你想要一个空字符串时会发生什么?

当你在 C 中创建一个空字符串时,你实际上是在分配一个指向存储空字符的内存位置的字符串。这类似于在餐桌上为幽灵保留一个座位。椅子在那儿,地方也安排好了,但没有人来吃晚饭。让我想起了上次约会。

这是 C 语言中的简单表示:

char 空字符串[1] = "";

在这个例子中,emptyString 是一个只有一个元素的数组(注意声明中的 [1]),它是 null 终止符。字符串的长度为零,但数组emptyString本身非常真实并且占用内存。这就像有一个空房子的地址。

在 C 中,字符串的长度是通过迭代每个字符直到遇到空终止符(' ')来确定的。这正是 strlen() 函数的作用。它对字符进行计数,直到找到空字节,不包括终止符本身。

strlen() 函数计算 s 指向的字符串的长度,不包括终止空字节(' ')。

因此 strlen(emptyString) 将从 0 开始计数器,但立即到达空字节,导致长度为 0。

零长度数组

在 C 中,数组一旦声明,大小通常是固定的。首先让我们用 C 语言(好吧,抱歉,看看)如何使用结构体实现动态或可增长的整数数组:

struct IntArray {
  整数*数据;     // 指向数组数据的指针
  整数长度;    // 数组中当前元素的个数
  整数容量;  // 数组的最大容量
};

这里,IntArray 表示管理整数数组的 C 结构体。它包括:

  • data:指向数组数据的指针(可以动态增长)。
  • length:数组中当前元素的数量。
  • capacity:数组的最大容量,表示在需要调整大小之前可以存储多少个元素。

与传统的固定大小数组不同,IntArray 的实例可以在添加或删除元素时动态调整其大小,类似于 Python 或 JavaScript 等高级语言中数组的工作方式。然而,在 C 语言中,这种灵活性伴随着额外的责任。开发人员必须手动管理内存分配和大小调整。他们需要在推送或弹出元素时跟踪数组的长度。

IntArray初始化时,会根据容量(以字节为单位)分配内存,分配的内存地址存储在数据指针中。然后长度字段被设置为零。此过程类似于 JavaScript 等高级语言在创建空数组时在内部执行的操作。

为什么这很重要

知道 C 中的空字符串只是一个指向 ' ' 字符的指针感觉很好。好奇心就足够了!这是我今天发的推文:

立即深入这些抽象的背后,你会体验到奇迹。

来源:https://dev.to/biraj21/empty-strings-and-zero-length-arrays-how-do-we-store-nothing-1jko

本类最新

查看更多