c - 指或不指

标签 c string pointers types struct

我有一种知道其大小的字符串,称为 pstring(Pascal 字符串的眨眼)。大小只是在内存中作为字节数组的前缀,而不是结构体{size, p_bytes}。 (原因是从概念上和实践上避免双重引用;以及结构体和字节数组的双重堆分配。)我可以使用仅分配 sizeof(size_t) 的工具 func 来做到这一点> bytes more,返回一个指向字节数组实际地址的指针,并提供一个宏来读取前面几个字节的大小。

相反,我想通过使用灵活数组成员的“灵活结构”在稍高的级别上做到这一点:

typedef struct {
    size_t   size;
    uint     hash;
    char     bytes[];
} PString;
// constructor:
PString * pstring (char * bytes, size_t size) {...}

(这些 pstring 也有一个哈希,因为它们被保存在池中。)但是现在,我有一个形而上学的问题来选择对 pstring 的正确访问。问题在于 pstring(就像普通字符串一样)只能通过指针进行操作。但是我应该如何提供接口(interface),无论是否指向?

  • 字符串最常见的是隐式指向,其类型如const char * string;,因此似乎很自然地“指向”类型 pstring,并且大家都知道它是指针类型。
  • 但是,在使用结构时,常见的做法是(我猜)隐式指向变量(通过指向类型),而是使用 * 显式声明变量 (有时会在他们的名字前加上“p_”前缀)。

那么,我应该在这里做什么,以便 pstrings 的用户清楚语义并轻松实践?

无论如何,var 都是指向的并且字段访问通过 -> 进行。到目前为止,如您所见,我选择了第二个选项:人们将 pstring 声明为 PString * ps;。但我准备根据以下论点进行更改:

  • pstring var 根本不能是无指向的(甚至比普通字符串还要小,因为通过结构复制我们会丢失字节 --> hello segfault)。
  • “pstring”中的“p”可以作为“pointed”的提醒。

你觉得怎么样?

最佳答案

我认为,您最好采用第二种方法。

对于隐式指针“C”字符串,它们的行为类似于字节数组,您可以直接从字节 1 开始访问字符串内容。但是,在这种情况下,它是构造的(用户定义的)类型,并且为了做出这种区分,我希望它是一个显式指针(即第二种方法)。

顺便说一句,您会提供对这些字符串执行比较、字符搜索等操作的函数吗?我建议您可以遵循 C++ String 类型的模型并提供一个 c_str 函数,该函数进一步提供指向“字节”的指针。

关于c - 指或不指,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13861270/

相关文章:

c - 给定一个数 A(=2^N),如何得到 N?

android - 导出字符串时出错

c++ - 检查用户是否输入了空白 C++

c - 在 C 中传递和返回数组

c - 附加字符串的函数返回指针/转换错误

c - 声明不兼容

c - printf 什么时候返回负数?

c - pthread_exit 与返回

html - 如何在 css 的帮助下在下一行显示不间断的字符串

c - 函数返回意外指针