2010-10-29 83 views
17
const char* a; 

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

回答

5

如果你交给一个char数组,它可能包含或不包含以null结尾的数据,实际上没有一个好的方法来检查。你可以做的最好的事情是搜索一个空字符,直到cert指定的长度(不是无限期!)。但0并不完全是在未初始化的内存区域中找到的不寻常的数据字节。

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

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

11

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

+0

'strnlen'为了安全起见。 – nmichaels 2010-10-29 17:24:24

+0

'strnlen'是平台特定的,不在标准中。 – jer 2010-10-29 17:26:22

+6

@Nathon:'strnlen'并不真正增加安全性,但是,它呢?如果你的函数需要一个以空字符结尾的字符串并且没有得到一个(或者如果一个函数被指定为返回一个以空字符结尾的字符串并且不返回),你的代码已经被破坏了。 – 2010-10-29 17:32:03

28

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

您需要使用strlen()来计算空值终止字符串的长度(注意长度返回包括空终止,所以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

OP已经使用'const',所以'const char a []'可能比'char a []'更好。 – aschepler 2010-10-29 17:23:04

+4

为了进一步阐明,'strlen()'只会给出char数组中数据的逻辑运算,而不是分配给它的字节数。我认为没有办法获得这个数字。 – 2010-10-29 17:42:58

4

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

此外,源代码中的所有双引号字符串文字(例如"abcd")都将自动以null结尾。

1

sizeof(a)返回const char *a的大小......不是它指向的大小。您可以使用strlen(a)来查找以空字符结尾的字符串的长度,并使用no,strlen的结果不包含空终止符。

6

这里的问题在于,您将编译时操作sizeof()与作为运行时操作的字符串的长度相混淆。当您运行sizeof(a)时得到4的原因是a是一个指针,并且的典型 C中指针的大小是4个字节。为了得到字符串的长度,使用strlen

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

+0

啊....笨我。但是当我做strlen时(a)我得到了4,而且我知道有一个“abcd”(来自gdb)。 – hari 2010-10-29 17:24:49

+0

@hari,4是正确的,因为字符串“abcd”的长度确实是4.然而,对于'a'的内存要求是'strlen(a)+ 1'来处理空终止符。这是C的一部分,只是适应了一些习惯。 – JaredPar 2010-10-29 17:26:56

+0

这是因为“abcd”的长度是4. strlen不计算空终止符。 – jer 2010-10-29 17:27:05