C 中 "string" 的定义

Definition for "string" in C

如果我错了请纠正我,但符号 "C string" 指的是指向内存中 3 个或更多字节的指针,而第 3 个字节为 NULL。


指针在内存中必须至少有4个字节(因为它们表示的地址值类似于整数,很可能存储在4个字节中)。即一个指针可以指向一个偏移地址而不会溢出,而根据数据类型,将读取n个字节。如果是char则只是要读取的偏移地址。因此,如果我们将 6 个字节分配给 int*,那么在没有 oferflow 的情况下我们最多可以有 2 个字符。


如果我上面说的和改写的是正确的。那么:

int* str = calloc(sizeof(int), 2);

是一个最多可以包含4个字符的字符串。 如果我们想单独处理字节,我们可以使用类型转换。类型转换也忽略警告。除此之外的一切,看起来都像一个字符串。我哪里错了?

C 字符串只是 char 数据类型的 nul 终止内存缓冲区的常规术语,C 标准库函数经常使用它。

C 字符串甚至可以是零长度,即单个 nul 终止符字节。

const char* s = "abc"; // C-string of length 3 pointing to a static string literal

char c = 0;
char* s = &c; // zero length C-string.

char s[] = "abc"; // C-string of length 3 allocated on the stack.

   // Another C-string of length 3 allocated on the stack
   // The brace initializer syntax explicitly shows the null terminator.
   //
    char s[] = { 'a', 'b', 'c', '[=10=]' }; 

确实如此。 C 字符串只是一个包含 char 数据的数组或内存缓冲区,其长度由首次出现的 '[=15=]' 字符决定。指针的大小与它完全无关。

C 中不存在字符串。C 仅具有以空字符结尾的字符数组。 char 数组的名称是指向数组中第一个 char 的指针。当您尝试打印一个 char 数组时,您将 char 数组的名称传递给 printf(或您用来打印的任何内容),它将继续打印每个 char,直到遇到空字符,此时它将停止。对于使 "string" 成为字符串的因素没有大小限制。

您的示例创建了一个指向 int 的指针,这不是您想要的。如果要模拟其他语言的字符串,需要创建一个指向char的指针。

"String"根本不是C语言的数据类型。这只是解释内存中字节序列的一种方法。如果 char * 类型的变量指向某块内存,并且该内存包含以零字节结尾的字节序列,那么用于最小字符串处理的各种库函数将使用该指针。内存是如何分配的,它有多大,非零字节是多少,都没有关系。

int* str = calloc(sizeof(int), 2);

这会在堆上为两个连续的 ints 分配 space 并 returns 一个指向它们位置的指针。它绝不是一个字符串。您可以装入多少 chars 取决于 int 的大小,它因平台而异,通常是 16、32 或 64 位之一,但也可以是大于 16 位的任何其他内容。