私が知っている標準的な方法はありませんが、解決策が見つからないというわけではありません。
以下は、これまでに一番きれいなコードではありません。変数がメモリ内でどこから始まるかを特定するためのハックのようなものです。以下は、エンディアンに応じて、異なる結果を与えることができることに注意してください:
#include <stdio.h>
#include <string.h>
typedef struct s_toto
{
int a:2;
int b:3;
int c:3;
} t_toto;
int
main()
{
t_toto toto;
unsigned char *c;
int bytes;
int bits;
memset(&toto, 0, sizeof(t_toto));
toto.c = 1;
c = (unsigned char *)&toto;
for (bytes = 0; bytes < (int)sizeof(t_toto); bytes++)
{
if (*c)
break;
}
for (bits = 0; bits < 8; bits++)
{
if (*c & 0b10000000)
break;
*c = (*c << 1);
}
printf("position (bytes=%d, bits=%d): %d\n", bytes, bits, (bytes * 8) + bits);
return 0;
}
は私がやっていることは、私が0に全体の構造体を初期化し、私は私が見つけたい変数の値として1を設定することです。その結果、構造内で1ビットのみが1に設定されます。それから私はゼロでないものを見つけるまで、バイトあたりのメモリバイトを読みます。一度見つけられると、そのビットが見つかるまでそのビットを見ることができます。
私は、メンバー変数の名前付けに混乱しています。 bit1、..、bit4はちょうど1ビットサイズか、あるいはbit1は3ビットサイズ、bit2は4ビットサイズ、bit3は5ビットサイズ、bit4は6ビットサイズであるはずですか? – rwols
ご迷惑をおかけして申し訳ございません。それはちょうど名前です。 bit1は3ビット、bit2は4ビットです。そんな感じ。私はメンバーの名前を変更しました。 –
私は[offsetof](http://en.cppreference.com/w/c/types/offsetof)があなたが探しているものだと信じています。 – rwols