参考文章:https://www.cnblogs.com/xmhsincere/p/4915354.html
1、三者长度strlen问题
int main () {char *str="xiaolong";printf("%d\n",strlen(str));return 0;
}
结果:

#include <stdio.h>
#include <string.h>int main () {char str[]="xiaolong";printf("%d\n",strlen(str));return 0;
}
结果

#include <string.h>int main () {char str[10]="xiaolong";printf("%d\n",strlen(str));return 0;
}
虽然数组大小是10,但是编译器自动在xiaolong后面添加了\0 ,因此长度不是10而是8

2、字符串大小问题
#include <stdio.h>
#include <string.h>int main () {char str[10]="xiaolong";printf("%d\n",sizeof(str));return 0;
}
运行结果

指定大小为n的char数组无论如何都是占用n个字节,例如此处10字节
#include <stdio.h>
#include <string.h>int main () {char *str="xiaolong";printf("%d\n",sizeof(str));return 0;
}
运行结果:
4
由于是指针,32位机器指针占4个字节
#include <stdio.h>
#include <string.h>int main () {char str[]="xiaolong";printf("%d\n",sizeof(str));return 0;
}

结果不是8而是9,因为默认在后面添加了一个\0, \0也算一个字节
3、字符串常量存放静态存储区实验
#include <stdio.h>char* get_mem()
{char *str="xiaolong";return str;}
int main () {char *str;str=get_mem();printf("%s\n",str);return 0;
}
结果:
还能返回打印xiaolong,因此,xiaolong字符串还在存储的地方没被销毁掉,说明xiaolong存放在静态区

4、局部字符串数组存栈区放实验
#include <stdio.h>char* get_mem()
{char str[]="xiaolong";return str;}
int main () {char *str;str=get_mem();printf("%s\n",str);return 0;
}

打印出错,由于“xiaolong“是数组成员,存放在栈区,所以在返回str时,xiaolong已经被销毁了,因此返回的地址指向的内容不再是xiaolong,所以是非法的
5、总结
- 字符串常量放在静态存储区,为只读,不能再通过指针修改,例如chr *p="xiaolong"
- strlen遇到\0结束,长度不包括\0
- sizeof计算占用多少字节时,\0也包含在内
















