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

时间:2013-02-21 11:00:56

标签: c sizeof arrays

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

5 个答案:

答案 0 :(得分:40)

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

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

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

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

答案 1 :(得分:13)

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

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

所以,仅当字符串跨越整个数组(例如char s[] = "stuff")时,将sizeof用于静态定义的数组返回什么你想要(并且更快,因为它不需要循环来找到空终止符)(如果最后一个字符是空终止符,你将需要减去1)。如果它没有跨越整个数组,它将不会返回你想要的内容。

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

答案 2 :(得分:10)

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

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

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

只需使用strlen()

答案 3 :(得分:3)

如果您使用mysql> SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_NAME="TEST"; +-------------+ | COLUMN_NAME | +-------------+ | user_id | | NAME | | value | +-------------+ 3 rows in set (0.00 sec) ,则sizeof()char *str将返回不同的答案。 char str[]将返回字符串的长度(包括字符串终止符),而char str[]将返回指针的大小(根据编译器而不同)。

答案 4 :(得分:2)

我喜欢使用:

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