sizeof表示null终止的const char *

时间:2010-10-29 17:14:53

标签: c string char

const char* a;

如何确保字符串'a'为空终止?当a =“abcd”并且我做sizeof(a)时,我得到4.这是否意味着它不是以null结尾?如果是的话,我会得到5?

6 个答案:

答案 0 :(得分:30)

sizeof(a)为您指定指针的大小,而不是指针指向的字符数组。就像你说过sizeof(char*)一样。

您需要使用strlen()来计算以null结尾的字符串的长度(请注意,返回的长度不包含空终止符,因此strlen("abcd")为4 ,而不是5)。或者,您可以使用字符串文字初始化数组:

char a[] = "abcd";
size_t sizeof_a = sizeof(a); // sizeof_a is 5, because 'a' is an array not a pointer

字符串文字"abcd"以空值终止;所有字符串文字都以null结尾。

答案 1 :(得分:12)

你得到4,因为这是你系统上指针的大小。如果你想得到一个以nul结尾的字符串的长度,你需要C标准库中的strlen函数。

答案 2 :(得分:6)

这里的问题是你混淆sizeof()这是一个编译时操作,其字符串的长度是一个运行时操作。运行sizeof(a)时返回4的原因是a是一个指针,C中指针的典型大小是4个字节。为了获得字符串的长度,请使用strlen

对于第二个问题,如何确保字符串为空终止。明确地这样做的唯一方法是null自己终止字符串。只给出char*,没有办法100%保证它被正确地终止。必须非常小心,以确保char*的生产者和消费者之间的合同被理解为谁终止了字符串。

答案 3 :(得分:5)

如果您交给一个char数组,其中可能有也可能没有以null结尾的数据,那么确实没有好的方法可以检查。你能做的最好的事情就是搜索一个空符号,直到指定一个指定长度(不是无限期!)。但是0并不是在未初始化的内存区域中找到的异常数据字节。

这是许多人不喜欢的C's事实字符串标准的众多内容之一。找到客户端给你的字符串长度最好是O(n)搜索操作,最坏的情况是分段错误。

另一个问题当然是数组和指针是可互换的。这意味着array_name + 2&(array_name[2])相同,sizeof(a)sizeof(char*),而不是数组的长度。

答案 4 :(得分:4)

sizeof(a)sizeof(const char*),指针的大小。它不受a内容的影响。为此,您需要strlen

此外,所有双引号字符串文字(如源代码中的"abcd")都会自动以空值终止。

答案 5 :(得分:1)

sizeof(a)返回const char *a的大小...而不是它所指向的大小。您可以使用strlen(a)来解释以null结尾的字符串的长度,不,strlen的结果不包括空终止符。