【问题标题】:Why doesn't C store strings as a linked list of characters? [closed]为什么 C 不将字符串存储为字符的链表? [关闭]
【发布时间】:2021-12-16 08:29:22
【问题描述】:

在 C 中,字符串存储为用 '\0' 消除的字符数组。所以我可以这样做:

char string[] = "Hello, World!";

char* string = "Hello, World!";

我可以使用预定义的字符串函数 [strcpy()] 来克服我不能超过字符串的初始化长度这一事实。

我正在尝试制作一个对非常大的数字进行基本数学运算的程序。我想把这些数字存储在一个链表中。但也许我可以将它们存储在一个字符串 (char*) 中并创建函数来直接对其进行操作。

在上述程序中使用链表有什么好处?

【问题讨论】:

  • 这个问题太没有重点了:要么问 C 字符串,要么问代表任意大的数字。
  • 我能想到的唯一好处是您可以轻松删除一个数字,而无需移动其余部分。任何其他操作都更昂贵。
  • 在 c-strings 中保留数字使打印更容易
  • 题主和题无关……嗯
  • C 不将字符串存储为字符链表的一个原因是,这种表示形式会比实际使用的数组表示形式大得多,而且处理效率会非常低。

标签: c string data-structures linked-list


【解决方案1】:

C 语言在 n1570 或 etter 等标准中定义。

由于历史原因,C 中的字符串在连续内存中表示。

到 2021 年,大多数处理器(x86-64、ARM、PowerPC ....)都在有效地处理它们(使用优化编译器,例如最近的 GCC

当然,您可以开发将“字符串”类类型表示为链表的 C 库。查看Glib(GTK 的一部分),并研究其源代码以获得灵感。

UTF8 编码每个字符有几个字节 (char)(如 é

Prolog 的一些实现将字符串表示为链表。

【讨论】:

  • 然而,对于非常大的字符串,更高级的内存管理值得一些开销。我建议搜索“绳索”和“跳过列表”。
  • 我相信 Glib 实现了这些。我知道绳索和跳过列表,但从未在实践中使用过。
猜你喜欢
  • 2020-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多