字符型(char)数组分配内存时占用多少个字节

1.直接定义的字符串会多占用一个字节
例:char s[]=“abcdefg”;
在实际分配内存时会占用8个字节的内存。多出来的一个字节用来存储"\0"用来表示字符串的结束。

示例程序及运行结果如下:

#include "stdlib.h"
#include "stdio.h"

void main()
{
	int i,t;
	char s[]="abcdefg";
	char *p;
	p=s;

	printf("字符串占用 %d 个字节\n\n",t=sizeof(s));

	for(i=0;i<t;i++)
	printf("%c   %x \n",*(p+i),*(p+i));
}

运行结果:
在这里插入图片描述

2.结构体中字符型(char)数组在分配内存时会多分配3个字节
示例程序及运行结果如下:

#include <stdio.h>
#include <stdlib.h>
struct student
{
	long no;
	char sex;
	char name[20];
	int age;
	float score;
	struct student *next;
};
struct student11
{
	long no;
	char sex;
	char name[20];
	int age;
	float score;
};
void main()
{
	struct student ppp={20208745,'M',"abcdefghijklmnopqr",23,123.5,NULL};//pp.name 里面装了18个字符
	int i;
	
	printf("输出各种数据类型占用空间大小\n");
	printf("sizeof(long)=%d\r\n",sizeof(long));
	printf("sizeof(char)=%d\r\n",sizeof(char));
	printf("sizeof(int)=%d\r\n",sizeof(int));
	printf("sizeof(float)=%d\r\n",sizeof(float));
	
	printf("\n输出两种结构体数据类型所需存储空间区别\n");
	printf("sizeof(struct student11)=%d\r\n",sizeof(struct student11));
	printf("sizeof(struct student)=%d\r\n",sizeof(struct student));//用于链表数据
	
	printf("\n显示结构体中字符串数组所占内存大小\n");
	printf("sizeof(ppp.name)=%d\r\n",sizeof(ppp.name));//显示PPP结构体里面name字符串所占字节数
	printf("\n\n");
	
	printf("输出数据的起始地址,用来看ppp.name实际占用多少内存\n");
	printf("sex_address=%x\r\n",&ppp.sex);
	printf("name_address=%x\r\n",ppp.name);
	printf("age_address=%x\r\n",&ppp.age);
	printf("age_address-name_address=%d\r\n",(char *)&ppp.age-ppp.name);//相邻存储区字节数差值
	//不同 类型的地址不能直接相减,需对int类型指针进行强制转换
	printf("\n\n");
	
	printf("输出结构体中字符串数组多占用的3个字节内容\n");
	for(i=0;i<23;i++)
	{
		printf("%x  %c  %x\n",ppp.name+i,*(ppp.name+i),*(ppp.name+i));//抓取地址里面的内容
	}
	
	printf("\n%s\n\n\n",ppp.name);
}

运行结果如下图。由运行图可知结构体中字符串数组多分配3个字节的结束标志内存。
在这里插入图片描述

  • 10
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值