在任何实现中,以下条件总是正确吗?
(strlen("some string with weird characters") + 1) * sizeof(char)
== sizeof("some string with weird characters");
我在问我是否可以可靠地使用(strlen(my_string) + 1) * sizeof(char)
来计算任何字符串的二进制大小。另外,请告诉我是否有更好的方法。
答案 0 :(得分:8)
不。唯一不同的情况是嵌入式null:
(strlen("strlen can see this\0strlen cannot see this") + 1) * sizeof(char)
!= sizeof("strlen can see this\0strlen cannot see this");
此外,sizeof(char)
始终是1
,因此它没有意义。
由于字符串文字是char[N]
类型的数组(对于某些正数N
),所以sizeof
方法是获取其大小的正确方法(但是/ sizeof(char)
是不需要,因为它是1
)。
答案 1 :(得分:2)
否!
char str[20] = "abc";
的大小为20,字符串长度为3。
根据定义,
sizeof(char)
始终为1
。通常,最好使用命名变量的大小,然后使代码更易于维护。例如
char *ptr = malloc(100 * sizeof(char));
更好
char *ptr = malloc(100 * sizeof *ptr);
,然后如果您要更改类型,则不必更改大小。
另一点是sizeof
由编译器计算,但strlen
直到运行时才计算(除编译器优化外)。但是对于字符串文字,如果它是您想要的大小,那么sizeof
通常会更有效,因为字符串文字在运行时无法更改。
答案 2 :(得分:0)
不,两者
(strlen(myString) + 1) * sizeof(char)
和
sizeof(myString)
并非总是保证相等。如果char数组myString
中包含的元素数量与所提到的数组索引不同,则strlen(myString)
和sizeof(myString)
将有所不同。例如,在以下情况下
char myString[10];
(strlen(myString) + 1) * sizeof(char)
和sizeof(myString)
都会得到相同的结果。但是如果其他情况像
char myString[10] = "Hello";
比结果会有所不同。
我也喜欢这个
(strlen(myString) + 1) * sizeof( *myString)
而不是
(strlen(myString) + 1) * sizeof(char)
sizeof( *myString)
看起来很普通。
旁注,如果myString
的类型为char*
,即指针类型为
char *myString = "some string with weird characters";
或用作函数参数保持像
void myTestFunc(char *myString) { }
然后sizeof(myString)
不起作用,strlen(myString) + 1) * sizeof( *myString)
更可取。
答案 3 :(得分:0)
在大多数情况下,等式将成立并且可以简化为sizeof(char)
根据定义为1
。
但是请注意,如果字符串文字包含嵌入的空字节,则strlen()
的计算结果将小于文字值减1。
这是最短的反例:
strlen("\0") + 1 != sizeof("\0") // strlen("\0") is 0 but sizeof("\0") is 2