求助,一道C++笔试题

hahali 2011-06-14 09:13:15
在VC6+WindowsXP环境下,某函数中有代码如下:

typedef struct _structA
{
int a;
char b;
short c;
}structA;

typedef struct _structB
{
char b;
int a;
short c;
}structB;

char str;
structA paramA;
structB paramB;
int size;

如果str的地址是0x0012ff7c,那么paramB的地址是多少?具体计算过程?
...全文
203 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
hahali 2011-06-16
  • 打赏
  • 举报
回复
谢谢楼上的各位,嘿嘿,懂了,嘿嘿
liuhex 2011-06-15
  • 打赏
  • 举报
回复
首先stuctA占用8个字节,structB占用12个字节。这个设计到内存对齐问题。
然后,要注意,自动变量在栈中的地址是由高到底的。也就是定义在前面的变量的内存地址要比后面的变量的地址大。
最后,就是编译器定义变量时的对齐问题。这个应该视编译器而定。
Liby 2011-06-15
  • 打赏
  • 举报
回复
米兰球迷~~~
我本想用这个做头像的~~~
nwpucoder 2011-06-14
  • 打赏
  • 举报
回复
内存对齐
不过注意vc是默认的8
Freedom 2011-06-14
  • 打赏
  • 举报
回复
有长见识了
青草渐枯黄 2011-06-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 guiyinzhou 的回复:]
应该是0x0012ff88吧,str地址为0x0012ff7c,要求paramB的地址,也就是算中间paramA占用的内存大小,这里涉及结构体内存对其问题,strucA的类型大小为12,所以paramB的地址为0x0012ff88
[/Quote]

strucA的类型大小应该为8才是,但从结果来看,paramA和paramB之间确实间隔了12个字节,这里应该有其它的原因;

另外,paramB的地址增长方向也有问题,无论是全局变量还是从栈的增长方向来看都是向低地址增长的,所以0x0012ff88肯定不对,可以这样算0x0012ff7c-1byte(char占用)-12bytes(paramA占用)
giveable-coding 2011-06-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 autumn_xl 的回复:]

这其中计算涉及了内存对齐的问题,这个你可以上网找找资料 不难,还是很多的。
int 占4字节,short占2字节,char占1字节,那么structA就占8字节
同理structB 也占8字节。
这要看你定义的变量是 什么类型的了,如果是局部变量(或者说是动态变量)是存放在栈中的,这也就是说地址的顺序和定义变量的顺序 是反过来的,如果计算的话就是依次减去 变量的字节数,所以structA ……
[/Quote]
好像structA和structB的大小不一样把,前者8个字节,后者12个
autumn_xl 2011-06-14
  • 打赏
  • 举报
回复
这其中计算涉及了内存对齐的问题,这个你可以上网找找资料 不难,还是很多的。
int 占4字节,short占2字节,char占1字节,那么structA就占8字节
同理structB 也占8字节。
这要看你定义的变量是 什么类型的了,如果是局部变量(或者说是动态变量)是存放在栈中的,这也就是说地址的顺序和定义变量的顺序 是反过来的,如果计算的话就是依次减去 变量的字节数,所以structA paramA;就是0x0012ff74;以下变量同理。
按照这个说法 你可以看看全局变量第一在什么地方,应该怎么计算我想你应该就会了。
giveable-coding 2011-06-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hedy007 的回复:]

0x0012ff84

typedef struct _structA
{
int a;
char b;
short c;
}structA;

占用8个字节
内存对齐a占4个,b和c合占4个。
[/Quote]
我前面说错了,是战8个字节,但是我在机器上运行,str的地址和paramA的地址貌似不是连着的
giveable-coding 2011-06-14
  • 打赏
  • 举报
回复
我在visual studio中运行感觉和我说的不太对劲,好像是变量存放的位置有关系,你在你的VC6上运行一下看看。
hedy007 2011-06-14
  • 打赏
  • 举报
回复
0x0012ff84

typedef struct _structA
{
int a;
char b;
short c;
}structA;

占用8个字节
内存对齐a占4个,b和c合占4个。
hahali 2011-06-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 guiyinzhou 的回复:]
应该是0x0012ff88吧,str地址为0x0012ff7c,要求paramB的地址,也就是算中间paramA占用的内存大小,这里涉及结构体内存对其问题,strucA的类型大小为12,所以paramB的地址为0x0012ff88
[/Quote]
哦,谢谢,看来是我想复杂了,嘿嘿,我以为定义的变量在内存中存放的顺序不一定跟定义的一致,嘿嘿,谢谢啦
giveable-coding 2011-06-14
  • 打赏
  • 举报
回复
应该是0x0012ff88吧,str地址为0x0012ff7c,要求paramB的地址,也就是算中间paramA占用的内存大小,这里涉及结构体内存对其问题,strucA的类型大小为12,所以paramB的地址为0x0012ff88

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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