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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中结构体在内存中的存储方式?相关的知识,希望对你有一定的参考价值。

看例子:
main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()

int b; 栈
char s[] = "abc"; 栈
char *p2; 栈
char *p3 = "123456"; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10); 堆
p2 = (char *)malloc(20); 堆


这是C中变量储存情况, 那么定义一个结构体,结构体内部成员有各种类型,它是什么储存方式呢? 它的内存连续吗

看资料上说“堆”内存不连续,可用malloc()函数申请 ,能否具体说明如何不连续法吗,假设堆中有一个地址0X1000,那么它的下一个地址不一定是0X1001,是这样吗?
傲世修罗王 能说的具体点吗,谢谢。

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


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

#include <stdio.h>
 
#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;
参考技术A 分配为内存时相邻内存之向要存储内存管理数据结构的数据,不会两次分配的内存地址相连的即使分配的地址是相邻的内存,多次分配内存后,通常都不会出现连续分配相邻地址的现象,分配的内存地址当然绝对不会连续了。 参考技术B 用malloc()申请的函数应该指的是不一定在内存的哪一个地方为你分配了一个储蓄数据的空间,但空间里的内容应该是连续的,不然调用时不是很乱嘛! 参考技术C 那要看这个结构体定义在什么地方,也要看它包含的变量的类型。 参考技术D 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都有可能。具体情况具体分析。本回答被提问者采纳

以上是关于C语言中结构体在内存中的存储方式?的主要内容,如果未能解决你的问题,请参考以下文章

结构体在内存中的存储方式(转)

Swift中结构体的方法调度&内存分区

结构体在内存中的存储(内存对齐)

C语言结构体存储问题

C语言结构体在定义的时候,各成员后面加冒号是啥意思?

C语言结构体占用字节数及存储与空间分配