c语言 字符数组 字符指针 sizeof strlen 的区别

来源:百度知道 编辑:UC知道 时间:2024/06/08 00:47:47
直接给代码

char *c="abcdef";
char d[]="abcdef";
char e[]={'a','b','c','d','e','f'};
printf("sizeof(c):%d\tstrlen(c):%d\n",sizeof(c),strlen(c));
printf("sizeof(d):%d\tstrlen(d):%d\n",sizeof(d),strlen(d));
printf("sizeof(e):%d\tstrlen(e):%d\n",sizeof(e),strlen(e));

输出结果是
4 6
7 6
6 14
求原因,最好是把根本原因说出来,这些数据在内存中怎么存放,机器读取时候的机制,谢谢!

sizeof(xxx)是个保留字,用来求分配给xxx的内存空间大小的,举例来说sizeof(int)就是求分配给int型变量的内存大小

sizeof(c):因为c是一个指针,指针一般分配4字节,于是结果就是4
sizeof(d):d是个未指定大小的字符串,大小会根据后面初始化的实际内容自动分配,又后面是个字符串,字符串最后是有个'\0'的,因此其分配的字节数就是6+1=7
sizeof(e):e是个未指定大小的字符数组,大小会根据后面初始化的实际内容自动分配,又后面是6个字符,而这不是字符串不需要补'\0',因此结果就是6

strlen(const char*)这是个字符串相关函数,其中,参数必须是个字符指针(指向字符串的指针)或字符串,而返回值就是这个指针指向的字符串的长度,字符串结束必须以'\0'为标记,但'\0'不计入字符串长度

strlen(c),c是指向字符串"abcdef\0"的指针,返回的是"abcdef"的长度6
strlen(d),d是字符串"abcdef\0",然后同上
strlen(e),由于e[]不是个字符串,仅仅是字符数组,所以理论上不应该做strlen()操作,但是这里求出来的是14,尝试输出e看看得到
abcdef烫abcdef
内存分配如下
...|abcdef|??abcdef\0...
其中|...|内的就是分配给e的内存空间,??是未初始化的部分,【后面的"abcdef\0"估计是分配空间初始化时为保证安全性自动在内存中填充的东西,而"abcdef??abcdef"显然占用了14个字节,所以输出的14(这里用不同编译器得到的结果可能不一样)】嗯 这个地方是说错了,后面那部分确实是d的内容,感谢幻の上帝指出

如果你将这句话改为:
char e[7]={'a','b','c',&#