sizeof为null终止的const char *
const char* a;
如何确保字符串’a’为空终止? 当a =“abcd”并且我做sizeof(a)时,我得到4.这是否意味着它不是以null结尾? 如果是的话,我会得到5?
如果你交给一个char数组,其中可能有也可能没有以null结尾的数据,那么确实没有一个好的检查方法。 你能做的最好的事情就是搜索一个空符号,直到达到一个指定的长度(不是无限期!)。 但是0并不是在未初始化的内存区域中找到的非常不寻常的数据字节。
这是许多人不喜欢C的事实字符串标准的许多事情之一。 找到客户端给你的字符串的长度最多是O(n)搜索操作,最坏的是分段错误。
另一个问题当然是数组和指针是可互换的。 这意味着array_name + 2
与&(array_name[2])
,而sizeof(a)
是sizeof(char*)
,而不是数组的长度。
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结尾; 所有字符串文字都以null结尾。
你得到4
因为这是你系统上指针的大小。 如果要获取nul终止字符串的长度,则需要C标准库中的strlen
函数。
这里的问题是你混淆sizeof()
这是一个编译时操作,其字符串的长度是一个运行时操作。 运行sizeof(a)
时返回4的原因是a
是一个指针,C中指针的典型大小是4个字节。 为了获得字符串的长度,请使用strlen
。
对于第二个问题,如何确保字符串为空终止。 明确地这样做的唯一方法是null自己终止字符串。 只给出一个char*
,没有办法100%保证它被正确地终止。 必须非常小心,以确保char*
的生产者和消费者之间的合同被理解为谁终止字符串。
sizeof(a)
是sizeof(const char*)
,指针的大小。 它不受a
的内容影响。 为此,你想要strlen
。
此外,所有双引号字符串文字(如源代码中的"abcd"
自动以null结尾。
sizeof(a)返回const char *a
的大小…而不是它所指向的大小。 您可以使用strlen(a)
来解释以null结尾的字符串的长度,否则,strlen的结果不包括null-terminator。