正如标题所暗示的,我的问题是如何在C
. sizeof
如果我在没有它的函数中声明它(字符串)是否很好用malloc
?或者,如果我已将其声明为指针?如果我用 初始化它malloc
怎么办?我想要一个详尽的答复。
5 回答
用于strlen
获取以null 结尾的字符串的长度。
sizeof
返回数组的长度而不是字符串。如果它是一个指针 ( char *s
),而不是一个数组 ( char s[]
),它将不起作用,因为它将返回指针的大小(在 32 位系统上通常为 4 个字节)。我相信数组将作为指针传递或返回,因此您将失去sizeof
用于检查数组大小的能力。
因此,只有当字符串跨越整个数组(例如char s[] = "stuff"
)时,使用sizeof
静态定义的数组才会返回您想要的(并且更快,因为它不需要循环查找空终止符)(如果最后一个字符是一个空终止符,您需要减去 1)。如果它不跨越整个数组,它不会返回你想要的。
所有这一切的替代方法实际上是存储字符串的大小。
虽然sizeof
适用于这种特定类型的字符串:
char str[] = "content";
int charcount = sizeof str - 1; // -1 to exclude terminating '\0'
如果str
是指针(sizeof
返回指针的大小,通常为 4 或 8)或具有指定长度的数组(sizeof
将返回与指定长度匹配的字节数,对于 char 类型是相同的),则它不起作用。
只需使用strlen()
.
如果您使用sizeof()
then a char *str
andchar 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");
干杯! 功能:size_t strlen (const char *s)