33

正如标题所暗示的,我的问题是如何在C. sizeof如果我在没有它的函数中声明它(字符串)是否很好用malloc?或者,如果我已将其声明为指针?如果我用 初始化它malloc怎么办?我想要一个详尽的答复。

4

5 回答 5

51

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

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

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

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

于 2013-02-21T11:04:20.793 回答
15

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

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

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

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

于 2013-02-21T11:03:58.450 回答
11

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

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

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

只需使用strlen().

于 2013-02-21T11:13:19.890 回答
4

如果您使用sizeof()then a char *strandchar str[]将返回不同的答案。char str[]将返回字符串的长度(包括字符串终止符),同时char *str将返回指针的大小(因编译器而异)。

于 2016-07-05T05:53:42.033 回答
1

我喜欢使用:

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

于 2015-12-30T03:42:54.917 回答