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