为什么C函数strlen()返回一个错误的char长度?

时间:2017-03-08 07:02:03

标签: c string strlen

我的C代码如下:

char s="MIDSH"[3];
printf("%d\n",strlen(&s));

跑步的结果是2,这是错误的,因为char只是一个' S'

有人知道为什么以及如何解决这个问题吗?

5 个答案:

答案 0 :(得分:10)

这实际上是一个非常有趣的问题。让我们分手吧:

"MIDSH"[3]

字符串文字有数组类型。所以上面将下标运算符应用于数组并计算到第4个字符' S'。然后它将其分配给单个字符变量 s

printf("%d\n",strlen(&s));

由于s是单个字符,而不是实际字符串的一部分,因此上述代码的行为未定义。

答案 1 :(得分:8)

strlen的签名是:

size_t strlen(const char *s);
/* The strlen() function calculates the
   length of the string s, excluding the
   terminating null byte ('\0'). */

strlen期望输入const char array为空终止。但是当您传递auto变量的地址时,您无法保证这一点,因此您的程序会有undefined behavior

  

有人知道为什么以及如何解决这个问题吗?

sizeof(char)保证为1。因此,请使用sizeof1

答案 2 :(得分:6)

声明

printf("%d\n",strlen(&s));  

对于给定的案例毫无意义。 strlen期望一个空终止字符串,s属于char类型,&s不一定指向字符串。你得到的是程序未定义行为的结果。

要获得s的大小,您可以使用sizeof运算符

printf("%zu\n", sizeof(s)); 

答案 3 :(得分:4)

strlen函数将其参数视为指向字符序列的指针,其中序列由'\0'字符终止。

通过将指针传递给单个字符变量s,您有效地说&s是这样一个序列中的第一个字符,但事实并非如此。这意味着strlen将继续在错误的前提下搜索内存,并且您将有未定义的行为

答案 4 :(得分:1)

使用时 " char s ="你在堆栈上创建了一个新的地址,这个地址不能添加或减少!所以尽管你给了strlen一个char *但是它找不到&#39 ; \ 0'通过添加地址。都错了。 你应该使用strlen和char的地址,这是一个array.like:

watched