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

正如标题所暗示的,我的问题是如何在C获取字符串的大小。 如果我在没有malloc的函数中声明它(字符串),那么使用sizeof是否malloc ? 或者,如果我已将其声明为指针? 如果我用malloc初始化它会怎么样? 我想做一个详尽的回复。

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

如果你想得到内存缓冲区的大小,它包含你的字符串,你有指向它的指针:

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

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

使用strlen获取以null结尾的字符串的长度。

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

因此, 只有当字符串跨越整个数组时 (例如char s[] = "stuff" ),将使用sizeof作为静态定义的数组返回您想要的内容(并且更快,因为它不需要循环查找null-terminator)(如果最后一个字符是空终止符,则需要减去1)。 如果它没有跨越整个数组,它将不会返回您想要的内容。

所有这一切的替代方案实际上是存储字符串的大小。

虽然sizeof适用于此特定类型的字符串:

 char str[] = "content"; int charcount = sizeof str - 1; // -1 to exclude terminating '\0' 

如果str是指针( sizeof返回指针的大小,通常是4或8)或指定长度的数组( sizeof将返回匹配指定长度的字节数,对于char类型相同),则不起作用。

只需使用strlen()

如果你使用sizeof()那么char *strchar str[]将返回不同的答案。 char str[]将返回字符串的长度(包括字符串终止符),而char *str将返回指针的大小(根据编译器而不同)。

我喜欢用:

 (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"); 

干杯! function: size_t strlen (const char *s)