参考文章: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也包含在内