字符型(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个字节的结束标志内存。
