【发布时间】:2011-12-21 13:11:39
【问题描述】:
可能重复:
Different answers from strlen and sizeof for Pointer & Array based init of String
谁能帮我理解c编程中sizeof方法和strlen方法的区别?
【问题讨论】:
标签: c
可能重复:
Different answers from strlen and sizeof for Pointer & Array based init of String
谁能帮我理解c编程中sizeof方法和strlen方法的区别?
【问题讨论】:
标签: c
strlen() 用于获取存储在数组中的字符串的长度。
sizeof() 用于获取任何类型数据的实际大小(以字节为单位)。
此外,sizeof() 是一个编译时表达式,可为您提供类型的大小或变量的类型。它不关心变量的值。
strlen() 是一个函数,它接受一个字符的指针,并从这个字符开始遍历内存,寻找一个空字符。它在找到空字符之前计算字符数。换句话说,它为您提供了 C 风格的以空字符结尾的字符串的长度。
两者完全不同。在 C++ 中,你不需要太多,strlen() 用于 C 风格的字符串,应该用 C++ 风格的std::strings 替换,而 sizeof() 在 C 中的主要应用是作为函数的参数,如malloc()、memcpy() 或 memset(),所有这些都不应在 C++ 中使用(使用新的、std::copy() 和 std::fill() 或 constructors)。
【讨论】:
std::copy 和 std::fill 如果您使用 C 样式数组,您也必须提供数组元素的数量。重点不是memcpy/memset vs STL算法,而是C-arrays/strings vs std::vector/std::array/std::string/其他容器。
NULL 指针和一个“空指针”,但它是一个空字符(或者我更喜欢:'\0' 字符)。
0 说“空字符”或“空字符”与为7 说“铃铛字符”或“铃铛字符”或“换行”一样有效, "(horizontal) tab" 等。我也更喜欢 "nul" 只是为了帮助区分类型和上下文,并且使用 ASCII 字符的 ASCII 认可名称提供了一种一致性。但是,我们不要假装这只是“null”的三个字母缩写:-)
'\0',因为这是您在代码中编写它的方式。你也可以只写0,但不清楚你是在处理一个角色。 C++ 标准确实将其称为“空字符类型值 charT()”。但在 C++ 中,NULL 是一个宏,由标准定义,所以我会避免这种情况(除非你指的是宏)。
sizeof 不是一个方法。它是一种编译时构造,用于确定特定类型或变量占用的内存量。另一方面,strlen 是一个函数,它计算从内存中指定位置开始的连续非零 char 值的数量(恰好与确定长度相同)以零结尾的 C 字符串)。
【讨论】: