strlen和字符数组的大小

bro*_*oot 2 c arrays

我有以下代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
   char p[5];
   char q[]="Hello";
   int i=0;

   strcpy(p,"Hello");
   printf("strlen(p)=%d\n",strlen(p));
   printf("sizeof(p)=%d\n",sizeof(p));
   printf("strlen(q)=%d\n",strlen(q));
   printf("sizeof(q)=%d\n",sizeof(q));
   for(i=0;i<6;i++)
   {
      printf("p[%d]=%c\tq[%d]=%c\n",i,p[i],i,q[i]);
   }
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

我得到的输出是:

strlen(p)=5
sizeof(p)=5
strlen(q)=5
sizeof(q)=6
p[0]=H  q[0]=H
p[1]=e  q[1]=e
p[2]=l  q[2]=l
p[3]=l  q[3]=l
p[4]=o  q[4]=o
p[5]=   q[5]=
Run Code Online (Sandbox Code Playgroud)
  1. 我知道声明数组如q [] ="some string"设置数组的大小等于字符串const中的字符数,但为什么两个数组声明类型的sizeof()输出有差异?
  2. strlen()和printf()如何知道何时停止,在声明两个数组时没有添加空字符.

cni*_*tar 6

您的问题中有多个问题.

strcpy(p,"Hello");
Run Code Online (Sandbox Code Playgroud)
  • 这是非法的,因为p只有5个字符长,所以没有剩余空间来添加终止0strcpy.因此,它不是以0结尾或在可用空间之外添加0字节 - 调用strlen它也是未定义的行为或至少是可疑的

  • 调用sizeofp是好的,并得到了5正确的值.

  • 调用strlen(q)yield 5因为q确实包含一个0终止符 - 通过用字符串文字初始化隐式添加 - 并且在0之前有5个字符

  • 由于它包含一个0终止符,q实际上是一个包含6个字符的数组,因此sizeof得到6.