C语言中结构体在内存中的存储方式?

2025-03-11 06:55:07
推荐回答(5个)
回答1:

结构体在内存中的存储方式,和常规的C语言变量、常量存储方式类似,唯的不同在于对齐。


只所以要进行数据对齐是因为编译器对结构的存储的特殊处理能提高CPU存储变量的速度,一般来说,32位的CPU内存以4字节对齐,64位的CPU的以8字节的对齐。一般可以使用#pragma pack()来指出对齐的字节数。比如下面的代码,在debug会显示结构体test的内存大小为28,如果生成release版则所占内存大小为32 。

#include 
 
#ifdef _DEBUG
#pragma pack(4)
struct test
{    
    char x[13]; // 13
    int d;        // 4    
    double f;     // 8
}ss;
#else
#pragma pack(8)
struct test
{    
    char x[13]; // 13
    int d;        // 4    
    double f;     // 8
}ss;
#endif
 
int main(void){  
  
    printf("%d\n", sizeof(ss));  
    return 0;
}

回答2:

分配为内存时相邻内存之向要存储内存管理数据结构的数据,不会两次分配的内存地址相连的即使分配的地址是相邻的内存,多次分配内存后,通常都不会出现连续分配相邻地址的现象,分配的内存地址当然绝对不会连续了。

回答3:

用malloc()申请的函数应该指的是不一定在内存的哪一个地方为你分配了一个储蓄数据的空间,但空间里的内容应该是连续的,不然调用时不是很乱嘛!

回答4:

那要看这个结构体定义在什么地方,也要看它包含的变量的类型。

回答5:

1. p1的10个空间是连续的,p2的20个空间也是连续的,因为malloc分配时就考虑到连续分配的问题。

2. p1,p2之间的地址不一定是连续的。因为p2申请地址时,重新调了malloc()。也就是从随机的地址开始连续分配20个空间。

3. 注意1.2里[空间]的意思,因为申请的数据类型不一样,比如char型,int型。所以每个空间的长度也不一样。假如int型占用2个byte,则地址0x1000的下一个地址有可能就是0x1002。因为0x1000+0x1001是一个int型数据。

4. 初学者可不看本条。再深入点,跟据编译器不同,一个int型占2byte还是4byte都有可能。具体情况具体分析。