快捷搜索: 王者荣耀 脱发

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

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

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

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

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

	printf("字符串占用 %d 个字节

",t=sizeof(s));

	for(i=0;i<t;i++)
	printf("%c   %x 
",*(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("输出各种数据类型占用空间大小
");
	printf("sizeof(long)=%d
",sizeof(long));
	printf("sizeof(char)=%d
",sizeof(char));
	printf("sizeof(int)=%d
",sizeof(int));
	printf("sizeof(float)=%d
",sizeof(float));
	
	printf("
输出两种结构体数据类型所需存储空间区别
");
	printf("sizeof(struct student11)=%d
",sizeof(struct student11));
	printf("sizeof(struct student)=%d
",sizeof(struct student));//用于链表数据
	
	printf("
显示结构体中字符串数组所占内存大小
");
	printf("sizeof(ppp.name)=%d
",sizeof(ppp.name));//显示PPP结构体里面name字符串所占字节数
	printf("

");
	
	printf("输出数据的起始地址,用来看ppp.name实际占用多少内存
");
	printf("sex_address=%x
",&ppp.sex);
	printf("name_address=%x
",ppp.name);
	printf("age_address=%x
",&ppp.age);
	printf("age_address-name_address=%d
",(char *)&ppp.age-ppp.name);//相邻存储区字节数差值
	//不同 类型的地址不能直接相减,需对int类型指针进行强制转换
	printf("

");
	
	printf("输出结构体中字符串数组多占用的3个字节内容
");
	for(i=0;i<23;i++)
	{
          
   
		printf("%x  %c  %x
",ppp.name+i,*(ppp.name+i),*(ppp.name+i));//抓取地址里面的内容
	}
	
	printf("
%s


",ppp.name);
}

运行结果如下图。由运行图可知结构体中字符串数组多分配3个字节的结束标志内存。

经验分享 程序员 微信小程序 职场和发展