免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: xiaozhu2007
打印 上一主题 下一主题

[C] BAIDU笔试题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-08-30 22:17 |只看该作者
晕,百度的题就这个样子啊?
一直担心会很难呢,呵呵,不过确实有比较难的。。。。

论坛徽章:
0
12 [报告]
发表于 2008-08-30 22:33 |只看该作者
原帖由 mik 于 2008-8-30 22:09 发表
char* p = (char*)(st[2].errstr  + 32);

这种烂代码估计是用来考考人外,根本不值一提

我就情愿这样写:char *p = &st[2].errstr[32];


是啊
这样的代码神似"谭浩强"里的示例代码

论坛徽章:
0
13 [报告]
发表于 2008-08-30 22:54 |只看该作者
因为
sizeof(st_t)=40

char *p = (char*)&st_t[3];

p - (char*)(st) 等于三个st的字节数, 所以是120

论坛徽章:
0
14 [报告]
发表于 2008-08-30 23:03 |只看该作者
这个题目如果给出的结构体是
struct st_t
{
int status;
short* pdata;
char errstr[30];
};
还是有的考的。
涉及到一个 “字节对齐” 的问题。
如果改成像我给的结构体,结果还是选 120

========================>
为了能使CPU对变量进行高效快速的访问,变量的起始地址应该具有某些特性,
即所谓的“对齐”。例如对于4字节的int类型变量,其起始地址应位于4字节边界上,
即起始地址能够被4整除。变量的对齐规则如下(32位系统):


Type

char
在字节边界上对齐

short (16-bit)
在双字节边界上对齐

int and long (32-bit)
在4字节边界上对齐

float
在4字节边界上对齐

double
在8字节边界上对齐

structures
单独考虑结构体的个成员,它们在不同的字节边界上对齐。
其中最大的字节边界数就是该结构的字节边界数。
MSDN原话:Largest alignment requirement of any member

例如:
struct t1
{
        int a;
        char b;
};

struct t2
{
       int a;
       char b[2];
};

struct t3
{
       int a;
       char b[4];
};

sizeof(struct t1)==sizeof(struct t2)==sizeof(struct t3)==8

论坛徽章:
0
15 [报告]
发表于 2008-08-30 23:26 |只看该作者
errstar[32]能编译通过?访问超界了吧.

原帖由 mik 于 2008-8-30 22:09 发表
char* p = (char*)(st[2].errstr  + 32);

这种烂代码估计是用来考考人外,根本不值一提

我就情愿这样写:char *p = &st[2].errstr[32];

论坛徽章:
0
16 [报告]
发表于 2008-08-31 00:10 |只看该作者
原帖由 towardWang 于 2008-8-30 23:26 发表
errstar[32]能编译通过?访问超界了吧.


你说得对,就是越界了,不过可以编译通过
本来这道题,它这样写就是越界了

论坛徽章:
0
17 [报告]
发表于 2008-08-31 09:17 |只看该作者
考的就是“越界”

论坛徽章:
0
18 [报告]
发表于 2008-08-31 10:41 |只看该作者
原帖由 flagcugb 于 2008-8-30 23:03 发表
这个题目如果给出的结构体是
struct st_t
{
int status;
short* pdata;
char errstr[30];
};
还是有的考的。
涉及到一个 “字节对齐” 的问题。
如果改成像我给的结构体,结果还是选 120

== ...

谢谢扩展,赞一个!

论坛徽章:
0
19 [报告]
发表于 2008-08-31 10:57 |只看该作者
原帖由 mik 于 2008-8-30 22:09 发表
char* p = (char*)(st[2].errstr  + 32);

这种烂代码估计是用来考考人外,根本不值一提

我就情愿这样写:char *p = &st[2].errstr[32];


看场合吧,我这边代码全这种风格的

论坛徽章:
0
20 [报告]
发表于 2008-08-31 14:56 |只看该作者
刚开始看错了题目
char* p = (char*)(st[2].errstr[2]  + 32);
难怪算错。。。
不过
sizeof(st_t)不一定就是40阿
st_t=4+1+32+x
x=0 OR 3
不一定就是4字节对齐阿
要看编译器怎么设置了

大家同意吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP