假设我的结构定义如下:
int positive = 0;
int negative = 0;
int count = 0;
int total = 0;
int average;
Random r = new Random();
int number = 0;
while (count > 20) {
number = r.nextInt(200);
total += number;
count++;
if (number > 0) {
positive++;
}
else if (number < 0) {
negative++;
}
}
average = (double) total / count;
System.out.println("The number of positives is " + positive + " ");
System.out.println("The number of negatives is " + negative + " ");
System.out.printf("The average is: " + average);
现在根据填充规则,字符变量可以从任何地址开始,因为它只有一个字节,而intger变量应该从一个可被4整除的地址开始,而short变量应该从任何偶数地址开始。 在这种情况下,如果我们假设字符变量从OFFSET 0开始。
typedef struct
{
char a;
int b;
char c;
}abc_t;
这里结构的总大小将变为12。
但我怀疑的是,结构的第一个元素是否是一个&#39; char?&#39;这里从偏移量1开始,然后根据填充规则,我们在a之后只有2个字节填充,因此结构的大小将是8个字节。
struct
{
char a; // OFFSET 0+3 bytes padding
int b; // OFFSET 4
char c; //OFFSET 5+3 bytes padding
}abc_t;
任何以短变量开头的结构变量都是如此。 如果我对此的理解是正确的,或者我们可以安全地假设任何结构的第一个成员总是从一个可被4整除的地址开始,你能告诉我吗?
提前多多感谢。
答案 0 :(得分:-1)
这里有一些问题:
1)int的大小不需要4个字节,它的sizeof(int)是编译器定义的。根据字长,可以是4字节,8字节甚至2字节。请参阅Is the size of C "int" 2 bytes or 4 bytes?。
2)结构中的字段对齐取决于编译器。您放置字段的顺序并不能保证更紧密的包装。但是,保留了字段的顺序。请参阅Why isn't sizeof for a struct equal to the sum of sizeof of each member?。
3)将较短的结构放在一起通常会导致更紧密的包装。
4)结构从字边界开始。在第一个字段之前从不存在任何填充。所以,是的,地址将在一个单词的开头。 Why use address of first element of struct, rather than struct itself?
希望这有帮助。