首页
社区
课程
招聘
[推荐]你能答出输出的结果吗?
2009-7-2 19:28 13570

[推荐]你能答出输出的结果吗?

2009-7-2 19:28
13570
#include <stdio.h>
#include <malloc.h>

struct{
        short a1;
        short a2;
        short a3;
}A;

struct{
        long a1;
        short a2;
}B;

void main()
{
         char *s1     = "0123456789";
         char s2[]    = "0123456789";
         char s3[100] = "0123456789";
         int  s4[100];
         char s5[]    = "a\n";
     void *s6     = (void*) malloc(100);

         s4[0] = 0;

         printf("%d\n", sizeof(s1));
         printf("%d\n", sizeof(s2));
         printf("%d\n", sizeof(s3));
         printf("%d\n", sizeof(s4));
         printf("%d\n", sizeof(s5));
         printf("%d\n", sizeof(s6));
         printf("%d\n", sizeof(A));
         printf("%d\n", sizeof(B));

}

你能答出输出的结果吗?

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞7
打赏
分享
最新回复 (27)
雪    币: 442
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ucantseeme 2009-7-2 20:07
2
0
学习了

根底不牢固啊,我
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
孙悟色 2009-7-2 20:13
3
0
4 10 100 400 3 4 8 8
应该是这样的吧,指针char好像都是int处理的,struct结构体好像对qi的都是4!字符串后面有一个0,随然不显示,但是它的作用是方便了字符指针!
雪    币: 1450
活跃值: (35)
能力值: (RANK:680 )
在线值:
发帖
回帖
粉丝
jackozoo 14 2009-7-2 20:42
4
0
LS的你选sizeof(s5) = 3, 为啥不选sizeof(s2)=11 ?
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ANANA 2009-7-2 20:49
5
0
基础知识~主要是指针与数组的异同,还有内存对齐。
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
求知求是 2009-7-2 20:57
6
0
我作弊了,告诉你们正确答案.
2,11,100,200,3,2,6,6
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
cntrump 13 2009-7-2 22:29
7
0
LS的忽悠大大滴
我在处理字符串的时候经常用到 sizeof 运算符 ........
明白了 sizeof 的含义,这些不在话下...
雪    币: 108
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
pch 1 2009-7-2 22:44
8
0
内存对齐,视环境而变吧……
雪    币: 1450
活跃值: (35)
能力值: (RANK:680 )
在线值:
发帖
回帖
粉丝
jackozoo 14 2009-7-2 23:12
9
0
6楼的难道还在用DOS系统 ?
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
孙悟色 2009-7-3 08:50
10
0
感谢前辈,前有车后有zhe !祝我实现我今年的目标
雪    币: 474
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
feierin 2009-7-3 16:31
11
0

还真没看出答案是什么
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
cntrump 13 2009-7-3 20:34
12
0
估计LZ要在第二贴公布答案了
雪    币: 1450
活跃值: (35)
能力值: (RANK:680 )
在线值:
发帖
回帖
粉丝
jackozoo 14 2009-7-3 22:13
13
0
答案还需要楼主公布吗
不清楚的,自己把代码跑一下不就知道了
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
cntrump 13 2009-7-3 22:16
14
0
神奇的jackozoo又出现了
雪    币: 1450
活跃值: (35)
能力值: (RANK:680 )
在线值:
发帖
回帖
粉丝
jackozoo 14 2009-7-4 13:56
15
0
回个贴都神奇 ?
雪    币: 306
活跃值: (153)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
pyq逍遥 1 2009-7-4 14:21
16
0
4,11,100,200,3,4,6,6(int 占2字节,指针占4字节)
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kongruojun 2009-7-4 15:43
17
0
按照我自己想的:4 11 100 400 3 4 6 6
我自己跑了一次:4 11 100 400 3 4 6 8
我的确不明白为什么struct B中 long+short=8
LS的.32位系统int 4字节1字节8位 4*8=32,你那是16位的DOS.
short 2位 32位系统long=int
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
绿豆青蛙 2009-7-4 15:54
18
0
内存对齐呀,内存对齐
把结构体B修改为
struct{
  [COLOR="Red"]short[/COLOR] a1;
  short a2;
}B;
运行查看结果为 2 + 2 = 4,和我们想的一样,再修改为
struct{
  [COLOR="Red"]char[/COLOR] a1;
  short a2;
}B;
运行,查看结果,奇怪了吧,怎么不是 1 + 2 呢?因为要实现数据的快速访问,所以数据在内存中最好对齐,这样CPU的运行效率才高,牺牲了内存来换效率。对齐的边界必须是 2 的 n 次方,所以sizeof(B) 就是 1 + 2 + 1.
另外内存对齐是有一个原则的,我就不说出来了,你试试这样改写结构体B,再运行查看结果就明白了,尽在不言中
struct{
  [COLOR="Red"]long[/COLOR] a1;
  char a2;
}B;
想一想为什么sizeof(B)会是8吧,想明白了就知道这个原则是什么了
雪    币: 131
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Alexandra 2009-7-4 16:01
19
0
我来说两句 。 俺也看的不咋明白  哈哈
雪    币: 190
活跃值: (20)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
aoanzhishu 4 2009-7-4 22:41
20
0
没想到此贴这么热闹啊
我面试时考官就给我这道题...

#include <stdio.h>
#include <malloc.h>

struct
{
}A;

struct{
        short a1;
        short a2;
        short a3;
}B;

struct{
        long a1;
        short a2;
}C;

class D
{
};

class E
{
        char a,b;
};

class F
{
static char a;
int b;
};

void main()
{
         char *s1     = "0123456789";
         char s2[]    = "0123456789";
         char s3[100] = "0123456789";
         int  s4[100];
         char s5[]    = "a\n";
                void *s6     = (void*) malloc(100);

         s4[0] = 0;

         printf("%d\n", sizeof(s1));
         printf("%d\n", sizeof(s2));
         printf("%d\n", sizeof(s3));
         printf("%d\n", sizeof(s4));
         printf("%d\n", sizeof(s5));
         printf("%d\n", sizeof(s6));
         printf("%d\n", sizeof(A));
         printf("%d\n", sizeof(B));
         printf("%d\n", sizeof(C));
         printf("%d\n", sizeof(D));
         printf("%d\n", sizeof(E));
         printf("%d\n", sizeof(F));
}

这是完整题目  运行在Windows XP下
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
cntrump 13 2009-7-5 09:02
21
0
编译器是GCC的话貌似 sizeof (A) == 0 ??
雪    币: 53
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
whvovi 2009-7-5 09:45
22
0
看了18楼解释,受益了,哈哈
雪    币: 46
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
挂挂 2009-7-5 09:54
23
0
汗。。。看不懂 这个语言
雪    币: 474
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
feierin 2009-7-6 08:31
24
0
内存对齐在面试中出现的比较多
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
honghongbp 2009-7-6 13:00
25
0
VS2005下
4  sizeof(指针) = 4
11 多一个'\0' 所以是10 + 1 = 11
100 字符数组 100 × sizeof(char) = 100
400 整数数组 100 × sizeof(int) = 400
3 同第二个 多一个'\0' 2 + 1 = 3
4 同第一个
6 都是short 所以3 × sizeof(short) = 6
8 如果出现了int 结构体的长度要以int为单位 即为int的整数倍 sizeof(int) + sizeof(short) 等于6 显然不够 所以还要补上2个字节 所以为8
具体看看这个 写的很清楚:
http://blog.sina.com.cn/s/blog_60a1a51d0100dz66.html
游客
登录 | 注册 方可回帖
返回