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