长度乘以sizeof(char)是否总是等于sizeof(literal)?

时间:2019-04-23 18:24:08

标签: c string byte

在任何实现中,以下条件总是正确吗?

(strlen("some string with weird characters") + 1) * sizeof(char) 
    == sizeof("some string with weird characters");

我在问我是否可以可靠地使用(strlen(my_string) + 1) * sizeof(char)来计算任何字符串的二进制大小。另外,请告诉我是否有更好的方法。

4 个答案:

答案 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