C语言中结构体在内存中的存储方式?
看例子:main.cppinta=0;全局初始化区char*p1;全局未初始化区main(){intb;栈chars[]="abc";栈char*p2;栈char*p3=...
看例子:
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,是这样吗?
傲世修罗王 能说的具体点吗,谢谢。 展开
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;
}
展开全部
分配为内存时相邻内存之向要存储内存管理数据结构的数据,不会两次分配的内存地址相连的即使分配的地址是相邻的内存,多次分配内存后,通常都不会出现连续分配相邻地址的现象,分配的内存地址当然绝对不会连续了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用malloc()申请的函数应该指的是不一定在内存的哪一个地方为你分配了一个储蓄数据的空间,但空间里的内容应该是连续的,不然调用时不是很乱嘛!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
那要看这个结构体定义在什么地方,也要看它包含的变量的类型。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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都有可能。具体情况具体分析。
2. p1,p2之间的地址不一定是连续的。因为p2申请地址时,重新调了malloc()。也就是从随机的地址开始连续分配20个空间。
3. 注意1.2里[空间]的意思,因为申请的数据类型不一样,比如char型,int型。所以每个空间的长度也不一样。假如int型占用2个byte,则地址0x1000的下一个地址有可能就是0x1002。因为0x1000+0x1001是一个int型数据。
4. 初学者可不看本条。再深入点,跟据编译器不同,一个int型占2byte还是4byte都有可能。具体情况具体分析。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询