[root@kanq c]# ./a.out
before sizeof is 4
before strlen is 3
behind sizeof is 4
before sizeof is 7
[root@kanq c]# cat b.c
#include<stdio.h>
#include<string.h>
void main(){
char a[]="abc";
char b[]="1234";
printf("before sizeof is %d \n",sizeof(a));
printf("before strlen is %d \n",strlen(a));
strcat(a,b);
printf("behind sizeof is %d \n",sizeof(a));
printf("behind strlen is %d \n",strlen(a));
}

strcat 前后 字符串执行sizeof 显示长度没有变化但是用strlen 就是实际字符串拼接后的长度
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- 技术专家团-小桥流水 2021-10-21 12:01关注
sizeof计算的是内存大小,sozeof得到的一般是固定值,strlen计算的是字符串长度,字符串的长度从地址开始一直到\0结束。
char a[]="abc";
这么定义以后,数组a的大小就是4,是固定不变的,(最后隐含了一个\0字符),所以sizeof(a)的大小永远是4.
执行strcat函数后,strcat将字符数组b中内容拼接到a后面,strcat自动在拼接后的字符串末尾添加\0,所以当使用strlen计算a的长度时,得到的是7(不含\0字符)。
代码这么写其实是错误的,字符拼接后超出了a的内存大小,会导致内存异常。strcat函数没有做内存检查机制,只是要求在输入参数时,a必须要有足够的内存空间,所以程序能运行出结果,但是这样是很危险的。本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报