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

}

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

字符串的sizeof是由定义时确定的。