strlen乘以sizeof(char)是否总是等于sizeof(literal)?
在任何实现中,以下内容是否始终正确strlen乘以sizeof(char)是否总是等于sizeof(literal)?,c,string,byte,C,String,Byte,在任何实现中,以下内容是否始终正确 (strlen("some string with weird characters") + 1) * sizeof(char) == sizeof("some string with weird characters"); 我在问是否可以可靠地使用(strlen(my_string)+1)*sizeof(char)来计算任何字符串的二进制大小。另外,如果有更好的方法,请告诉我。没有 大小为20,字符串长度为3。 编辑: 这两种方法产生相同的结果
(strlen("some string with weird characters") + 1) * sizeof(char)
== sizeof("some string with weird characters");
我在问是否可以可靠地使用(strlen(my_string)+1)*sizeof(char)
来计算任何字符串的二进制大小。另外,如果有更好的方法,请告诉我。没有
大小为20,字符串长度为3。
编辑: 这两种方法产生相同的结果(针对特定数据),但需要注意两点:
sizeof(char)
根据定义总是1
。通常,最好使用命名变量的大小,这样代码就更容易维护。比如说
char *ptr = malloc(100 * sizeof(char));
不如
char *ptr = malloc(100 * sizeof *ptr);
如果你要改变类型,你不必改变大小
另一点是
sizeof
由编译器计算,但strlen
直到运行时才计算(除了编译器优化)。但是对于字符串文字,如果它是您想要的大小,那么sizeof
通常会更有效,因为字符串文字在运行时不能更改。否。它唯一不同的情况是嵌入空值:
(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
)。
(strlen(myString) + 1) * sizeof(char)
及
并不总是保证平等。如果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)
更可取。在大多数情况下,等式成立,可以简化为sizeof(char)
定义为1
但是请注意,如果字符串文字包含嵌入的空字节,strlen()
的计算结果将小于文字的大小减去1
下面是最短的反例:
strlen("\0") + 1 != sizeof("\0") // strlen("\0") is 0 but sizeof("\0") is 2
sizeof(char)
定义为1。因此,用sizeof(char)
@zwol:乘或除任何东西都是不好的风格,除非你想神奇地得到一个size\u t
类型,而不需要typedef
它的标题@R嗯,是的,我想这可能很有用,但是什么时候你不能包括stddef.h
?是的,你可以使用strlen()+1
以可靠地计算任何字符串的大小,但您需要知道并非所有字符串文字都描述字符串。字符串是以第一个空字符结尾并包括第一个空字符的连续字符序列。请注意,char myString[10]=“Hello”代码>不是字符串文字。它是一个char
数组,初始化后包含字符串“Hello”
。这不是一回事。
void myTestFunc(char *myString) { }
strlen("\0") + 1 != sizeof("\0") // strlen("\0") is 0 but sizeof("\0") is 2