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;	
}

结果 

 

 

#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也包含在内

 

 

 

 

 

 

 

 

  • 19
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值