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

参考文章: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;	
}

结果 

扫描二维码关注公众号,回复: 11265337 查看本文章
#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;	
}

运行结果:

由于是指针,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、总结

  1. 字符串常量放在静态存储区,为只读,不能再通过指针修改,例如chr *p="xiaolong"
  2. strlen遇到\0结束,长度不包括\0
  3. sizeof计算占用多少字节时,\0也包含在内

猜你喜欢

转载自blog.csdn.net/shenlong1356/article/details/106321092
今日推荐