请教 关于结构体的问题

来源:百度知道 编辑:UC知道 时间:2024/06/21 20:10:53
#include "stdio.h"
void main()
{sruct S {char c; int k;} s;
sruct A {char c[9]; double d;} a;
sruct B {char *c[9]; double *d;} b;
sruct C {char c[8]; double d;} c;
printf("%d,%d,%d,%d \t",sizeof(S),siseof(a),sizeof(B),sizeof©);
}
请问为什么输出结果为8,24,40,16
谢谢大家们的关注,小弟谢谢了

结构体分配内存采用对齐方式
sruct S {char c; int k;} char是1字节 int 是4字节 所以char后面空3个字节补齐 得8字节
以上面的类推
char c[9]; double d c[]站9个字节 d站8个 可以把c看呈两部分 c的前8个和后1个 然后空7 个补齐 9+7+8得 24
char *c[9]; double *d char *和double *的指针是4字节,跟地址总线大小相同 4字节 就是32位的 所以 (9+1)*4=40
char c[8]; double d; 这个就不用说了 8+8 没有用到空位补齐

这涉及字节对齐的知识,你可以上百度或者GOOGLE搜一下.
总之就是目前的32位计算机,在读取长度为4字节的倍数的数据时会提高速度,因此结构体会在结构中增加空白字节,把大小凑成4字节的倍数(有double成员的时候可能会是8的倍数).

你是在VC++里编译的吧。C语言对结构体的填充没有做规定,所以,结构体填充是由浏览器决定的。你现在可以去DJGPP GCC 或者是其他的编译器中你会发现,结果还是不同的,所以才有sizeof运算符。
对了,顺便给你说一下,你的编程风格不是C语言,倒是有几分C++的影子。