我的C代码如下:
char s="MIDSH"[3];
printf("%d\n",strlen(&s));
跑步的结果是2,这是错误的,因为char只是一个' S'
有人知道为什么以及如何解决这个问题吗?
答案 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
。因此,请使用sizeof
或1
。
答案 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