2017-01-18 21 views
0

C代码:当我将strlen()应用于指向单个char的指针时,为什么我得到7的长度?

char c = 'a'; 
char *p = &c; 
printf("%lu\n",strlen(p)); 

而且我得到一个结果7和我不知道这7如何出来。

+3

因为'p'没有指向一个有效的(NUL终止)字符串 –

+0

@George尝试但仍然得到7' –

+0

'strlen()'返回类型是'size_t',您应该使用不同的格式:'printf( “%lu \ n”,strlen(p));' - >'printf(“%zu \ n”,strlen(p));' – chqrlie

回答

1

请记住,C中的字符串实际上被称为空终止的字节字符串。所有字符串都以单个字符'\0'终止,这意味着单字符字符串实际上是两个字符:单字符加终止符。

当您的代码中指针指向c时,您没有两个字符,只有c中包含的单个字符。你不知道这个字符在内存中是否有终止符,所以当strlen寻找那个终止符时,它会通过这个字符出去到不属于任何字符串的内存中寻找它,并且你将有未定义的行为


要尝试一个说明你有什么,看看这个“图形”表示:

 
+---+  +-----+---------------------- 
| p | --> | 'a' | indeterminate data... 
+---+  +-----+---------------------- 

这基本上看起来像在内存中。变量p指向存储角色的位置,但在此之后,内存中只是不确定的数据。这看起来是随机的,你不能说出哪里会有一个对应于字符串结束符的字节。

没有办法说明为什么strlen的值是7,除了它在字符后面的不确定数据中找到6个非终结符字节。下次你运行它,或者如果你在不同的系统上运行它,你可能会得到一个完全不同的结果。

+0

是的,我知道strlen会查找终止符。我的问题实际上是为什么结果总是7,如果strlen只是在内存中寻找'\ 0'。 –

+0

@WeissZucker更新了我的答案,希望它更清晰。 –

2

变量p指向单个字符,而不是以空字符结尾的字符串。所以当你打电话给strlen时,它会尝试访问c之后的任何内存。这调用undefined behavior

什么是在这种特殊情况下发生是在内存a后有六个非零字节后面是一个零字节,所以你得到7.但是,您不能依赖此行为。例如,如果在a之前和之后添加更多本地变量,即使未使用的变量,您也可能会得到不同的结果。

0

因为strlen发现从传递的地址开始的第一个空字符。你只传递字符地址,所以strlen试图在内存中向前看,直到变量c之后的内存中的第一个空字符。

无论如何,你不能确定结果,它取决于编译器和你写的所有代码。而且,你的程序甚至会因为内存异常而失败。

相关问题