[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必须要有足够的内存空间,所以程序能运行出结果,但是这样是很危险的。本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 程序不包含适用于入口点的静态Main方法
- ¥15 素材场景中光线烘焙后灯光失效
- ¥15 请教一下各位,为什么我这个没有实现模拟点击
- ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
- ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
- ¥20 有关区间dp的问题求解
- ¥15 多电路系统共用电源的串扰问题
- ¥15 slam rangenet++配置
- ¥15 有没有研究水声通信方面的帮我改俩matlab代码
- ¥15 ubuntu子系统密码忘记