为什么strlen()会给一个未定义数组大小的char数组错误的值?

mfuanj7w  于 2023-04-19  发布在  其他
关注(0)|答案(3)|浏览(113)
#include<stdio.h>
#include<string.h>
int main(){
  int a[]={1,2,3,4};
  int size= sizeof(a)/sizeof(int);
  printf("\nSize/capacity of integer type array(with no limit) %d\n",size);

  int a1[6]={1,2,3,4};
  int size1= sizeof(a1)/sizeof(int);
  printf("\nSize/capacity of integer type array(with a limit of 7) %d\n",size1);

printf("\n");

  char b[7]={'a','b','c','d','e'};
  int size2= sizeof(b)/sizeof(char);
  int length=strlen(b);
  printf("\nSize/capacity of char type array(with a limit of 7) %d\n",size2);
  printf("\nNumber of char type data in the array %d\n",length);

  char br[]={'k','l'};
  int size3= sizeof(br)/sizeof(char);
  int length1=strlen(br);
  printf("\nSize/capacity of char type array(with no limit) %d\n",size3);
  printf("\nNumber of char type data in the array length1 %d\n",length1);    //answer should have been 2

 return 0;
}`

它给了我7作为值length 1的输出。当我注解掉上面的块(在br[]的初始化之上)时,数组长度显示为3。我想知道为什么会发生这种情况和解决方案。我是新手,但提前感谢。
上面代码的输出:
整数类型数组的大小/容量(无限制)4
整数类型数组的大小/容量(限制为7)6
char类型数组的大小/容量(限制为7)7
数组中的char类型数据数5
char类型数组的大小/容量(无限制)2
数组中char类型数据的数量length 1 7

f87krz0w

f87krz0w1#

strlen并不告诉你字符数组的长度,它告诉你一个以null结尾的字符串的长度。数组br不保存字符串,因为它的长度只够保存用于初始化它的单个字符,而这些字符不包括值为0的字节。
如果使用字符串文字初始化数组而不是字符的初始化器列表:

char br[]="kl";

然后调整数组的大小以包含作为字符串文字一部分的终止空字节,然后可以对其使用字符串函数。

yshpjwxd

yshpjwxd2#

strlen通过查找空终止符“\0”来工作,并且字符数组不会以空终止符结束。
把这个换了

char br[]={'k','l'};

到这个

char br[]={'k','l', '\0'};

然后对B做类似的改变(加上数组的大小加1),看看会发生什么。

wh6knrhe

wh6knrhe3#

$ man strlen:
[...]
The strlen() function computes the length of the string s
[...]
$ man string:
[...]
The string functions manipulate strings that are terminated by a null byte.
[...]

4'e''l'结尾的“char array”不是空终止的,因此不是字符串,因此对其中一个字符串调用strlen是UB。

相关问题