2025-12-06 11:09:50 舰船研究院

c语言字符串长度,占用字节大小,存放位置等问题

参考文章:https://www.cnblogs.com/xmhsincere/p/4915354.html

1、三者长度strlen问题

int main () {

char *str="xiaolong";

printf("%d\n",strlen(str));

return 0;

}

结果:

#include

#include

int main () {

char str[]="xiaolong";

printf("%d\n",strlen(str));

return 0;

}

结果

#include

int main () {

char str[10]="xiaolong";

printf("%d\n",strlen(str));

return 0;

}

虽然数组大小是10,但是编译器自动在xiaolong后面添加了\0 ,因此长度不是10而是8

2、字符串大小问题

#include

#include

int main () {

char str[10]="xiaolong";

printf("%d\n",sizeof(str));

return 0;

}

运行结果

指定大小为n的char数组无论如何都是占用n个字节,例如此处10字节

#include

#include

int main () {

char *str="xiaolong";

printf("%d\n",sizeof(str));

return 0;

}

运行结果:

4

由于是指针,32位机器指针占4个字节

#include

#include

int main () {

char str[]="xiaolong";

printf("%d\n",sizeof(str));

return 0;

}

结果不是8而是9,因为默认在后面添加了一个\0, \0也算一个字节

3、字符串常量存放静态存储区实验

#include

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

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结束,长度不包括\0sizeof计算占用多少字节时,\0也包含在内