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

use*_*487 6 c arrays string pointers

您好我是这个网站的新手,我需要一些帮助来理解在C中编码需要字符串的结构时会被视为"规范"的内容.基本上我想知道在使用C中的结构来跟踪结构所需的所有内存时,下列哪种方式将被视为"行业标准":

1)固定尺寸字符串:

typedef struct
{
    int damage;
    char name[40];
} Item;
Run Code Online (Sandbox Code Playgroud)

我现在可以使用 sizeof(Item)

2)字符数组指针

typedef struct
{
    int damage;
    char *name;
} Item;
Run Code Online (Sandbox Code Playgroud)

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

i)使用固定尺寸是否有任何其他优势(1)

char name[40];
Run Code Online (Sandbox Code Playgroud)

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

char *name;
Run Code Online (Sandbox Code Playgroud)

如果是的话,有什么好处?

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

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

Ben*_*igt 7

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

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

在第三种情况下,有一个功能,例如strlen搜索终结符并找到长度.

使用指针的两种情况都可以指向紧跟在结构的固定部分之后的数据,如果您以这种方式仔细分配它.如果要强制执行此操作,请在结构的末尾使用灵活的数组(不需要指针).像这样:

typedef struct
{
    int damage;
    char name[]; // terminated
} Item;
Run Code Online (Sandbox Code Playgroud)

要么

typedef struct
{
    int damage;
    int length_of_name;
    char name[];
} Item;
Run Code Online (Sandbox Code Playgroud)