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