下面程序为什么输出不是10,而是16

#include
#include
typedef struct _data
{
int id;
char buff[10]l
}data_t;
int main()
{
data_t data;
char ch[10] = "0123456789";
printf("%d\n",strlen(ch));
return 0;
}

char ch[] 声明的是字符数组。你去百度一下strlen,strlen实际上是,从参数表示的地址往后找,找到第一个'\0',即串尾。你声明的char[]并没有放入'\0'所以会找到其他乱七八糟的东西。不同编译器的处理结果也不同,你可以用字符指针来定义字符串

    char *ch = "0123456789";
    printf("%d\n",strlen(ch));

或者

    char *ch[10] = {"0123456789"};
    printf("%d\n",strlen(ch[0]));
 char ch[10] = "0123456789";

改成

 char ch[11] = "0123456789";

呢?

数组越界了,应该是ch[11],strlen是找到第一个\0作为结束,如果改成ch[11]结果就是10

你把你的字符数组给大一点就行了,放入023456789后系统还会放一个'\0'然后strlen的结果才准确。你改成char ch[]="0123456789"也可以。

 strlen的实现机制类似如下代码:
int strlen(char * p)
{
int n = 0;
while (*(p++) != '\0') n++;
return n;
}
所以因为你的程序没有\0,它会继续往下,直到遇到\0,结果不可预料。

你那程序编译不会通过吧,ch[10]然后赋值长度11?居然还能输出。。。。

你为ch赋值的元素过多了,应该要小于十个字符的字符串。这种情况他会找到计算机中ch后的第一个‘\0’并计算这之间的长度。

应为strlen计算的时到达“\0”时有多长