我有以下代码:
#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)
您的问题中有多个问题.
Run Code Online (Sandbox Code Playgroud)strcpy(p,"Hello");
这是非法的,因为p只有5个字符长,所以没有剩余空间来添加终止0strcpy.因此,它不是以0结尾或在可用空间之外添加0字节 - 调用strlen它也是未定义的行为或至少是可疑的
调用sizeof上p是好的,并得到了5正确的值.
调用strlen(q)yield 5因为q确实包含一个0终止符 - 通过用字符串文字初始化隐式添加 - 并且在0之前有5个字符
由于它包含一个0终止符,q实际上是一个包含6个字符的数组,因此sizeof得到6.
| 归档时间: |
|
| 查看次数: |
24528 次 |
| 最近记录: |