это моя программа
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
struct bitfield {
unsigned a:3;
char b;
unsigned c:5;
int d;
}bit;
printf("%lu \n",sizeof(bit));
return 0;
}
Я ожидал, что размер этой структуры будет довольно большим, но на моей машине он оказался равным 8, потому что unsigned занимает 4 байта. Теперь причина, по которой я ожидал большего, заключалась в том, что я ожидал, что char b
будет на границе байта, чтобы он правильно выровнялся в памяти. Теперь я предполагаю, что компилятор помещает a, b, c, все в эти 4 байта. Я новичок в C, поэтому, пожалуйста, потерпите меня. Является ли мое предположение, что все остальные типы данных, кроме битовых полей, обязательно должны быть по байту неверными? Если это правильно, я ожидаю, что a
возьмет целое число без знака, а b
возьмет байт, а затем заполнение 3 байтами и так далее. Что мне здесь не хватает?
a
будет занимать то же место, что и целое число без знака? Это битовое поле, оно занимает 3 бита вне зависимости от того, что стоит перед ним или после него. - person n. 1.8e9-where's-my-share m.   schedule 30.07.2017a
занимает 3 бита. Вот что говорит:3
в своем определении.b
не имеет на это никакого влияния. Он переходит к следующему байту, в котором нет битов, занятыхa
. - person n. 1.8e9-where's-my-share m.   schedule 30.07.2017sizeof
никак не связано с выравниванием по стандарту. Байт является минимальной единицей измерения для обоих (1
). Объект не может быть не выровнен по байту. - person too honest for this site   schedule 30.07.2017