c - 我应该如何在 C 结构中声明字符串?

标签 c arrays string pointers

你好,我是这个网站的新手,我需要一些帮助来理解在用 C 编写需要字符串的结构时什么是“规范”。基本上我想知道在使用 C 中的结构来跟踪结构所需的所有内存时,以下哪些方法将被视为“行业标准”:

1) 固定大小的字符串:

typedef struct
{
    int damage;
    char name[40];
} Item;

我现在可以使用 sizeof(Item) 获取大小

2) 字符数组指针

typedef struct
{
    int damage;
    char *name;
} Item;

我知道我可以使用第二个变量存储 name 的大小,但还有其他方法吗?

i) 使用固定尺寸 (1) 还有其他优势吗

char name[40];

与执行以下操作并使用指向字符数组的指针 (2) 相比?

char *name;

如果是这样,有什么优势?

ii) 此外,使用指向 char 数组 (2) 的指针的字符串将按顺序存储在结构之后(紧接在指向字符串的指针之后),还是将其存储在内存中的其他位置?

iii) 我想知道如何找到 char * 字符串变量的长度(不使用 size_t 或整数值来存储长度)

最佳答案

基本上有 3 种常见的字符串约定。这三个都是在野外发现的,用于内存中表示和存储/传输。

  1. 固定尺寸​​。访问非常高效,但如果实际长度不同,您既浪费空间又需要以下方法之一来确定“真实”内容的结尾。
  2. 长度前缀。额外的空间包含在动态分配中,以保持长度。从指针中,您可以找到字符内容和它前面的长度。示例:BSTR 有时长度被编码为更节省空间的短字符串。示例:ASN-1
  3. 已终止。字符串会一直延伸到第一次出现终止字符(通常为 NUL),并且内容不能包含该字符。变体使终止符依次为两个 NUL,以允许字符串中存在单个 NUL 字符,然后通常将其视为字符串的打包列表。其他变体使用字节填充(UTF-8 也可以)等编码来保证存在一些为终止保留的代码,这些代码永远不会出现在内容的编码版本中。

第三种情况,有strlen之类的函数来搜索终止符,求长度。

这两种使用指针的情况都可以指向紧跟在结构的固定部分之后的数据,如果您以这种方式仔 segmentation 配的话。如果你想强制这样做,那么在结构的末尾使用一个灵活的数组(不需要指针)。像这样:

typedef struct
{
    int damage;
    char name[]; // terminated
} Item;

typedef struct
{
    int damage;
    int length_of_name;
    char name[];
} Item;

关于c - 我应该如何在 C 结构中声明字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24497621/

相关文章:

C++、GTK+ 和字符串类型

c - Pin 工具 - 通过地址拦截指令以转储寄存器值

c - 试图找到两个数组的非支配解

c - 从 C 中的数组打印重复项时出现冗余结果?

python - 如何从文件中读取 float ?

更改 char 指针数组中的字符串

python - np.ascontiguousarray 与 np.asarray 与 Cython

C、获取unsigned char以使用ascii 2表

c - 错误:cannot find libary file when trying to link the library file

c++ - 有没有办法为 std::array 创建函数模板特化