C 如何获取以字节为单位的字符串大小?

C 如何获取以字节为单位的字符串大小?,c,sizeof,arrays,C,Sizeof,Arrays,正如标题所暗示的,我的问题是如何获得C中字符串的大小。如果我在一个函数中声明了malloc,那么使用sizeof好吗?或者,如果我把它声明为指针?如果我用malloc初始化它呢?我希望得到详尽的回答。用于获取以空结尾的字符串的长度 sizeof返回数组的长度,而不是字符串的长度。如果它是指针(char*s),而不是数组(char s[]),它将不起作用,因为它将返回指针的大小(在32位系统上通常为4个字节)。我相信数组将作为指针传递或返回,因此您将无法使用sizeof检查数组的大小 因此,仅当字

正如标题所暗示的,我的问题是如何获得
C
中字符串的大小。如果我在一个函数中声明了
malloc
,那么使用
sizeof
好吗?或者,如果我把它声明为指针?如果我用
malloc
初始化它呢?我希望得到详尽的回答。

用于获取以空结尾的字符串的长度

sizeof
返回数组的长度,而不是字符串的长度。如果它是指针(
char*s
),而不是数组(
char s[]
),它将不起作用,因为它将返回指针的大小(在32位系统上通常为4个字节)。我相信数组将作为指针传递或返回,因此您将无法使用
sizeof
检查数组的大小

因此,仅当字符串跨越整个数组时(例如
char s[]=“stuff”
),使用
sizeof
进行静态定义的数组将返回您想要的结果(并且速度更快,因为它不需要循环查找空终止符)(如果最后一个字符是空终止符,则需要减去1)。如果它不跨越整个数组,则不会返回所需的值

另一种方法是存储字符串的大小。

您可以使用。大小由终止的空字符决定,因此传递的字符串应该是有效的

如果要获取包含字符串的内存缓冲区的大小,并且您有指向它的指针:

  • 如果是动态数组(使用malloc创建),则无法获取 它的大小,因为编译器不知道指针指向什么。 ()
  • 如果是静态数组,可以使用
    sizeof
    获取其大小

如果您对动态数组和静态数组之间的差异感到困惑,请检查。

,而
sizeof
适用于此特定类型的字符串:

char str[] = "content";
int charcount = sizeof str - 1; // -1 to exclude terminating '\0'
如果
str
是指针(
sizeof
返回指针的大小,通常为4或8)或具有指定长度的数组(
sizeof
将返回与指定长度匹配的字节数,对于字符类型,这些字节数是相同的),则该函数不起作用

只需使用strlen()

我喜欢使用:

(strlen(string) + 1 ) * sizeof(char)
这将为您提供以字节为单位的缓冲区大小。您可以将其与snprintf()一起使用,这可能会有帮助:

const char* message = "%s, World!";
char* string = (char*)malloc((strlen(message)+1))*sizeof(char));
snprintf(string, (strlen(message)+1))*sizeof(char), message, "Hello");

干杯!函数:
size\t strlen(const char*s)
如果使用
sizeof()
char*str
char-str[]
将返回不同的答案。
char-str[]
将返回字符串的长度(包括字符串终止符),而
char*str
将返回指针的大小(根据编译器的不同而不同)。

请注意,
sizeof
实际上并没有给出字符串的长度。对于字符串文本,
sizeof
包括空终止符。对于
char
数组,
sizeof
给出数组中的元素数(这是一个不可预测的量,大于数组内容的字符串长度)指出“<代码> StLLN 和 SsieOS/<代码>返回两个根本不同的东西。在32位系统上指针的大小并不总是4个字节。考虑如果CalaBIT是32位。除此之外,考虑16位OS和编译器是否存在于32位系统上。和硬件。指针的大小由编译器决定,而不是由操作系统或硬件决定。如果编译器选择使用与操作系统或硬件相同的大小,则这是编译器的选择。此外,不同的指针可能有不同的大小。@ModifyalValue将“始终”更改为“通常”。您的问题不清楚您是想知道“字符串”的大小,还是想知道保存“字符串”的字符数组/内存块的大小。@alk已编辑。希望更清楚。谢谢。实际上大小是
strlen()+1
(1表示终止字符)@0x69字符串的大小通常定义为不包括空终止符。@ModifiableL值的含义是-不可能直接从动态数组中获取大小。当然可以存储大小,但这不是重点。@artaxerxe:C定义a
char
为1字节,但不定义一个字节为8位。so、 虽然就C而言,
char
确实始终是一个字节,但它不一定是一个八位字节,而且C标准之外的许多世界都认为“byte”意味着“八位字节”。字符大于8位的C实现是少数,但包括很多DSP。许多“可移植的”由于各种原因,代码不会在DSP上运行,因此您可以决定是否假设一个字节为8位。值
CHAR\u BIT
肯定会告诉您。@Dukeling Hm…然后将
strlen()
bytes with
memcpy
复制到其他(非空)缓冲区并打印它。您将看到的是新字符串+垃圾。这是我的论点,字符串大小(字节)是
strlen()+1
(但是字符串长度是
strlen()
)。在您的示例中,由于str是一个类型名,是否应该将其括起来?@ramrunner
str
是变量名。它是一个数组,因此
sizeof str
将返回整个数组的大小(以字节为单位)。当像上面那样声明数组时,数组大小正好是字符串文本的大小,包括终止
'\0'
。和
 sizeof
的优先级高于
-
,因此
sizeof str
不需要任何括号,尽管为了清晰起见在这里添加括号并不是一件坏事,我承认。(1)
strlen()
总是返回以字节为单位的长度,将其乘以1不会增加任何内容;(2)缓冲区的大小和它包含的字符串的长度之间可能没有关系;(3)您是否尝试过编译这些代码?(1)没有乘以