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

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

2009-7-2 19:28
13793

#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));

}

你能答出输出的结果吗?


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (27)
雪    币: 442
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
学习了

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

还真没看出答案是什么
2009-7-3 16:31
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
12
估计LZ要在第二贴公布答案了
2009-7-3 20:34
0
雪    币: 1450
活跃值: (35)
能力值: (RANK:680 )
在线值:
发帖
回帖
粉丝
13
答案还需要楼主公布吗
不清楚的,自己把代码跑一下不就知道了
2009-7-3 22:13
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
14
神奇的jackozoo又出现了
2009-7-3 22:16
0
雪    币: 1450
活跃值: (35)
能力值: (RANK:680 )
在线值:
发帖
回帖
粉丝
15
回个贴都神奇 ?
2009-7-4 13:56
0
雪    币: 306
活跃值: (153)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
4,11,100,200,3,4,6,6(int 占2字节,指针占4字节)
2009-7-4 14:21
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
按照我自己想的: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
2009-7-4 15:43
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
内存对齐呀,内存对齐
把结构体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吧,想明白了就知道这个原则是什么了
2009-7-4 15:54
0
雪    币: 131
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
我来说两句 。 俺也看的不咋明白  哈哈
2009-7-4 16:01
0
雪    币: 190
活跃值: (20)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
20
没想到此贴这么热闹啊
我面试时考官就给我这道题...

#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下
2009-7-4 22:41
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
21
编译器是GCC的话貌似 sizeof (A) == 0 ??
2009-7-5 09:02
0
雪    币: 53
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
看了18楼解释,受益了,哈哈
2009-7-5 09:45
0
雪    币: 46
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
汗。。。看不懂 这个语言
2009-7-5 09:54
0
雪    币: 474
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
内存对齐在面试中出现的比较多
2009-7-6 08:31
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
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
2009-7-6 13:00
0
游客
登录 | 注册 方可回帖
返回
//