程序运行时,结构体的内存分配,大讨论。。。

thingking 2003-02-28 04:31:26
十分疑惑:
定义一个结构体
typedef struct example
{
int a;
int b;
struct example *next;
}*link;
link a; ----------(1)
a=(link)malloc(sizeof(link)); ----------(2)
a=(link)malloc(sizeof(*a)); ----------(3)

问题:
1。当程序执行到(1)时,内存的分配是怎样的?是不是已经为 a,b都分配了内存
2。(2)(3)有和区别?
3。当程序在编译时,结构体变量的内存分配细节是怎样的?


...全文
304 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouzhaohan 2003-02-28
  • 打赏
  • 举报
回复
你的最后一个问题在网上搜struct align padding就可以找到很多这方面的讨论。
windcsn 2003-02-28
  • 打赏
  • 举报
回复
惭愧,看花了眼
chinajiji 2003-02-28
  • 打赏
  • 举报
回复
1。当程序执行到(1)时,内存的分配是怎样的?是不是已经为 a,b都分配了内存
link a; 相当于:struct example* a;即定义了一个指向struct example的指针,a->a,a->b没有分配内存.指针变量存放在stack中,而不是heap中.

2。(2)(3)有和区别?

a=(link)malloc(sizeof(link)); ----------(2)
相当于:
a = (struct example*)malloc(sizeof(struct example*));
即:
a = (struct example*)malloc(4);
如果在32机器上,如vc6.0上,则:sizeof(struct example*) == 4;

我觉得:
a=(link)malloc(sizeof(link)); ----------(2)
在内存分配上有问题,因为指针a所指的内存只分配了4字节(如果sizeof(struct example*) == 4的话),而sizeof(struct example) = 2 * sizeof(int) + sizeof(struct example *) == 2 * 4 + 4 = 12(不考虑位对齐);
如果改成这样:
link* a = (link*)malloc(sizeof(link));
就对了.此时,a是一个二重指针;
而下面这个语句:
a=(link)malloc(sizeof(*a)); ----------(3)
等价于:
a = (struct example*)malloc(sizeof(struct example));
a 是一个指向 struct example的一级指针,sizeof(struct example) == 12(如上述);

3。当程序在编译时,结构体变量的内存分配细节是怎样的?
我不知道你想问什么?
晨曦2003 2003-02-28
  • 打赏
  • 举报
回复
1.到1时,指针所示赋所指空间,故没有为工a,b分配内存。

2.(2)分配的为一个指针大小的空间,四字节;
(3)分配的为此结构体所占用的大小空间,十二字节。

3.结构体动态分配时是按其内部所有变量所占用空间的总和来分配空间的。
sunriselx 2003-02-28
  • 打赏
  • 举报
回复
(1)link声明为指针,所以a是指针,所以a->a,a->b没有分配内存
(2)这种用法是错的,只分配了4byte内存,sizeof(a)等于sizeof(struct example*),应该a=(link)malloc(sizeof(struct example))
(3)没问题,编译器会把sizeof(*a)替换为sizeof(struct example);
windcsn 2003-02-28
  • 打赏
  • 举报
回复
1,这个时候只分配指针的内存,而指针指向未定,也就是你想要给分配的结构内的内容没有分配
2,没有什么区别,都是取得结构的大小,一个用结构的名称,另一个用指向结构的指针的解除引用
3,编译的时候和内存分配有什么关系?我想最终得到的内存为变量ab的内存和一个指针的内存
zhouzhaohan 2003-02-28
  • 打赏
  • 举报
回复
4)2)中分配的空间的首地址丢了,内存泄漏。
zhouzhaohan 2003-02-28
  • 打赏
  • 举报
回复
1)在栈里给分配一个指针类型大小的空间,里面放的是a的值。
2)要从堆里分配一块空间,大小是指针类型大小(可能实际上不止这么多)。a为这块空间的首地址。
3)要从堆里分配一块空间,大小是sizeof(struct example)(可能实际上不止这么多)。a为这块空间的首地址。
4)2)中分配的空间的首地址对了,内存泄漏。
Againstwind 2003-02-28
  • 打赏
  • 举报
回复
(1)的时候应该指给Link a分配了指针所用的空间吧!
(3)这种用法对吗?我很疑惑!

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧