c语言中为struct分配内存空间是否一定是连续空间?

如果不是,那么能不能自己分配内存,让它保证在一个lianxukongjian因为如果是连续空间就可以直接用memorycopy从一个结构体拷贝到另外一个,当结构体比较大的... 如果不是,那么能不能自己分配内存,让它保证在一个lian xu kong jian
因为如果是连续空间就可以直接用memory copy 从一个结构体拷贝到另外一个,当结构体比较大的时候,不必一一赋值。
展开
 我来答
jssysyx
推荐于2017-11-23 · TA获得超过184个赞
知道答主
回答量:42
采纳率:0%
帮助的人:39.7万
展开全部
有人给对齐原则做过总结,具体在哪里看到现在已记不起来,这里引用一下前人的经验(在没有#pragma pack宏的情况下):

原则1、数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。

原则2、结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b里有char,int,double等元素,那b应该从8的整数倍开始存储。)

原则3、收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。

这三个原则具体怎样理解呢?我们看下面几个例子,通过实例来加深理解。

例1:struct {
short a1;
short a2;
short a3;
}A;

struct{
long a1;
short a2;
}B;

sizeof(A) = 6; 这个很好理解,三个short都为2。

sizeof(B) = 8; 这个比是不是比预想的大2个字节?long为4,short为2,整个为8,因为原则3。

例2:struct A{
int a;
char b;
short c;
};

struct B{
char b;
int a;
short c;
};

sizeof(A) = 8; int为4,char为1,short为2,这里用到了原则1和原则3。

sizeof(B) = 12; 是否超出预想范围?char为1,int为4,short为2,怎么会是12?还是原则1和原则3。

深究一下,为什么是这样,我们可以看看内存里的布局情况。

a b c
A的内存布局:1111, 1*, 11

b a c
B的内存布局:1***, 1111, 11**

其中星号*表示填充的字节。A中,b后面为何要补充一个字节?因为c为short,其起始位置要为2的倍数,就是原则1。c的后面没有补充,因为b和c正好占用4个字节,整个A占用空间为4的倍数,也就是最大成员int类型的倍数,所以不用补充。

B中,b是char为1,b后面补充了3个字节,因为a是int为4,根据原则1,起始位置要为4的倍数,所以b后面要补充3个字节。c后面补充两个字节,根据原则3,整个B占用空间要为4的倍数,c后面不补充,整个B的空间为10,不符,所以要补充2个字节。

再看一个结构中含有结构成员的例子:

例3:struct A{
int a;
double b;
float c;
};

struct B{
char e[2];
int f;
double g;
short h;
struct A i;
};

sizeof(A) = 24; 这个比较好理解,int为4,double为8,float为4,总长为8的倍数,补齐,所以整个A为24。

sizeof(B) = 48; 看看B的内存布局。

e f g h i
B的内存布局:11* *, 1111, 11111111, 11 * * * * * *, 1111* * * *, 11111111, 1111 * * * *

i其实就是A的内存布局。i的起始位置要为8的倍数,所以h后面要补齐。把B的内存布局弄清楚,有关结构体的对齐方式基本就算掌握了。
ziyang64
2010-12-16 · TA获得超过962个赞
知道小有建树答主
回答量:529
采纳率:0%
帮助的人:812万
展开全部
当然是连续的空间,可以用memory copy。不仅一个struct,就是多个struct的数组也是连续的空间。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
dongyue2008
2010-12-16 · TA获得超过3603个赞
知道大有可为答主
回答量:1300
采纳率:100%
帮助的人:595万
展开全部
这个得看是编译器吧。C语言本身并没有规定struct的内存空间是否一定要连续,但是很多编译器比如VC、VS,在实现的时候,都是为struct分配连续的内存空间。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
武仙716
2019-01-10
知道答主
回答量:1
采纳率:0%
帮助的人:785
展开全部
用#pragma pack(1)让成员1字节对齐,就可以不让有任何插值,就可以连续了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
kwbmt04
2010-12-16 · TA获得超过1665个赞
知道小有建树答主
回答量:1557
采纳率:0%
帮助的人:827万
展开全部
int *p = (int *)malloc(100);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 3条折叠回答
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式