当前位置: 代码迷 >> C语言 >> 有编程经验的人进来看下这个问题?
  详细解决方案

有编程经验的人进来看下这个问题?

热度:166   发布时间:2006-10-19 22:16:11.0
以下是引用我不是郭靖在2006-10-19 21:58:07的发言:

有什么问题?
VC缺省情况下是按 #pragma pack(4)执行的

如果是这样的话,
typedef struct {
char a;
} cc;
main () {
cc d;
printf("%d\n",sizeof(d));
}
这个结果的答案是1,而不是4哦
----------------解决方案--------------------------------------------------------
mytc下是3,
dvec++是8。
10楼发现的也很奇怪,除了编译器的问题,顺序也有问题?
高人指点。。
----------------解决方案--------------------------------------------------------
楼上好像已经解释了!是由于字节对齐引起的。不过还是不太明白。
----------------解决方案--------------------------------------------------------

以下是引用bestboy555在2006-10-19 22:16:11的发言:

如果是这样的话,
typedef struct {
char a;
} cc;
main () {
cc d;
printf("%d\n",sizeof(d));
}
这个结果的答案是1,而不是4哦

我的妈咪呀! 为什么以前用是4的.
----------------解决方案--------------------------------------------------------
#include<stdio.h>
#include<stdlib.h>
main () {
char *d = (char*)malloc(1);
printf("%d\n",sizeof(d));
}

这就是4啦.
----------------解决方案--------------------------------------------------------
恩,你可以看看Insert The C++ Mode中有具体描述,在VC以及其他某些编译器中他们对内存的分配方式是按照4的整数倍进行分配内存,这样可以达到对内存方便管理的功效,所以可能会损失一些内存空间,但是对于问题的方便解决,损失一点内存,又有多少人会去在乎他呢,何况现在内存的价格,呵呵,而且对于每一个结构损失&lt;=3个字节,一个大工程也不过用到几百个类,合起来也不过就K级单位,呵呵,当然在什么单片机什么的上就不知道了,呵呵,也许他们的内存分配方式不一样,可能会省用点呢。具体请那位更有研究的高手解释下。
----------------解决方案--------------------------------------------------------
呵呵,楼上的,你测试的是指针,大小肯定是4个,呵呵,这个不用再多说了

----------------解决方案--------------------------------------------------------
的确,指针是4个位. 哎....
----------------解决方案--------------------------------------------------------


以下只是我的猜测。

终于明白了为什么以前看到的总是以4位对齐,
因为以前的总是大于4位的。
typedef struct {
char a;
} cc;
main () {
cc d;
printf("%d\n",sizeof(d));
}
的的确是1。
没超过4位,不会按4位对齐。
typedef struct {
int b;
char a;
} cc;
main () {
cc d;
printf("%d\n",sizeof(d));
}
就是8啦。
因为它已经超过4位, 按照标准它是5,
5位按4位对齐,那就是8啦。


----------------解决方案--------------------------------------------------------
  相关解决方案