---逆渡默行--- 2021-10-21 11:49 采纳率: 100%
浏览 21
已结题

strcat 前后 字符串执行sizeof 显示长度没有变化但是用strlen 就是实际字符串拼接后的长度


[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));

}

  • 写回答

2条回答 默认 最新

  • 关注

    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必须要有足够的内存空间,所以程序能运行出结果,但是这样是很危险的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月29日
  • 已采纳回答 10月21日
  • 创建了问题 10月21日

悬赏问题

  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记