c语言结构体内存
❶ 为什么c语言结构体的内存大小是24
指针大小是固定的,与指向的地址内容无关,与机器位数有关。
大小等于机器位长,64位指针大小是8,32位指针大小是4。
如果编译器设置了对齐,那么:
64位就是 8*3=24。
32位就是4*3=12。
你再运行看看。
❷ c语言 结构体 共用体 占内存字节
共用体:
sizeof(union
data1)的值为16.在编译器默认设置的情况下,该共用体最大基本类型为double,它占8字节,所以此共用体以8来对齐。字符数组c2占9个字节,那么整个共用体应该占9个字节,但按照对齐原则,实际分配给它的内存为16字节。
结构体:
struct
data以8个字节对齐,long类型的成员1分配8个字节。s、i、c、a原本分别占4、2、1、10个字节。由于考虑到对齐,s分配4个字节,i分配
2个字节,c分配2个字节,此时刚好用完8个字节。a原本分配10个字节,由于考虑到对齐,要使整个结构体所占的存储空间是8的倍数,所以分配给它16个字节。因此结构体data占8+4+4+2+16=32个字节。
❸ C语言中结构体占用内存大小的问题
不会,同一个结构体占用的内存都是一样的,
stOne和stTwo之所以不同,是因为内存对齐问题。
取内存时,是按照主机系统是多少位来取的
32位系统,每次取四个字节
64位系统,每次取8个字节
根据你sizeof得到的结果,你的系统是32位的,所以每次取四个字节,而stOne char类型占用一个,而int占用四个,所以char类型自动占用了4个,否则,如果char占用一个,取得时候,去了一个char,然后去了int变量的前三个,这样会出问题,所以,会得到你上面sizeof的结果
stTwo,就不会因为是两个char类型挨着的,这样两个char类型占用四个,取得时候先取两个char,再取int。
❹ c语言结构体的问题,存储空间大小
win32
4字节对齐
变量内存的起始地址的边界是跟它类型一致的
比如int类型,可以认为它存在4的倍数的地址,short存在2字节倍数开始的地址,char存在1字节开始的地址,即任意地址
因此,回过头来看
第一个结构
假设int
a;///4字节倍数地
short
b;//推理a的末尾是4字节倍数地址也是2字节倍数地址,所以b是挨着a存的
char
c;//任意其实地址,挨着b存放
看起来7个字节就放下了,但是需要兼顾4字节对齐的原则,在末尾补了一个字节
第二个结构也类似
结构体与普通类型并无大区别,存储区域也一样的
❺ c语言结构体存储大小
分配内存时,编译器考虑同结构里最宽的元素类型对齐,或4 字节对齐。
struct
{
int i; // 这里 最宽的元素类型 是 int -- 4 字节
char b; // 所以给它分配1字节后,再浪费3个字节,凑成4字节
}numb;
所以一共用8个字节。
❻ C语言中结构体在内存中的存储方式
结构体在内存中的存储方式,和常规的C语言变量、常量存储方式类似,唯的不同在于对齐。
只所以要进行数据对齐是因为编译器对结构的存储的特殊处理能提高CPU存储变量的速度,一般来说,32位的CPU内存以4字节对齐,64位的CPU的以8字节的对齐。一般可以使用#pragma pack()来指出对齐的字节数。比如下面的代码,在debug会显示结构体test的内存大小为28,如果生成release版则所占内存大小为32 。
#include<stdio.h>
#ifdef_DEBUG
#pragmapack(4)
structtest
{
charx[13];//13
intd;//4
doublef;//8
}ss;
#else
#pragmapack(8)
structtest
{
charx[13];//13
intd;//4
doublef;//8
}ss;
#endif
intmain(void){
printf("%d ",sizeof(ss));
return0;
}
❼ C语言结构体内存空间如何分配问题
看来你是64位的机器了,64位的机器是以8字节来排的,比如你的char name[20]要占20个字节,那么内存会分配3个内存块(暂且这么理解),是24个字节,而double 是占了8个字节,这个时候给char name[20] 分配的24个字节还剩下4个字节,已经存不下double了,所以又开辟了一个内存块来存double,一共32个字节。 你把double改为int, 你会发现是占用了24个字节空间。不知道你能不能理解
❽ C语言结构体在内存中的分配
因为内存对齐。
为了CPU更快地寻址,编译器会进行内存对齐。
char
c1;
//分配1字节空间
char
c2;
//分配1字节空间
short
s;
//上面的两个char占用空间刚好等于一个short,不会发生对齐,分配2字节空间
int
i;
//上面的两个char一个short占用空间刚好等于一个int,不会发生对齐,分配4字节空间
因此最后结构体test2的size为8字节
char
c1;
//分配1字节空间
short
s;
//地址未对齐,会发生内存对齐,补齐1字节的空间,然后再为short分配2字节空间
char
c2;
//分配1字节空间
int
i;
//地址未对齐,会发生内存对齐,补齐3字节的空间,然后再为int分配4字节空间
因此最后结构体test1的size为1+1(补齐)+2+1+3(补齐)+4=12字节
欲知详情,请网络“内存对齐”,这里不再详述。
❾ C语言结构体占内存多少
C语言获取变量、数据类型内存占多少,使用sizeof运算符即可。
关于结构体所占的内存多少,一般还要考虑对齐的问题。只所以要进行数据对齐是因为编译器对结构的存储的特殊处理能提高CPU存储变量的速度,一般来说,32位的CPU内存以4字节对齐,64位的CPU的以8字节的对齐。一般可以使用#pragma pack()来指出对齐的字节数。比如下面的代码,在debug会显示结构体test的内存大小为28,如果生成release版则所占内存大小为32 。
#include<stdio.h>
#ifdef_DEBUG
#pragmapack(4)
structtest
{
charx[13];//13
intd;//4
doublef;//8
}ss;
#else
#pragmapack(8)
structtest
{
charx[13];//13
intd;//4
doublef;//8
}ss;
#endif
intmain(void){
printf("%d ",sizeof(ss));
return0;
}