私は C コードを読んでいて、コードを正しく理解しているかどうかを知りたいと思っていました。
以下に示すように、ヘッダー ファイルで定義された構造体 BF_salt があります。
typedef
{
BF_WORD salt[4];
..
..
} BF_SALT;
メイン C コードでは、関数への呼び出しがあります。
function func1()
{
static BF_SALT salt;
func2(salt.salt,x,y);
....
}
func2(BF_WORD * dst,x,y)
{
unsigned char * dptr= (unsigned char*)dst;
int c1,c2;
// c1 and c2 are initialized here.
// in a loop, an operation similar to the below is performed.
*dptr++ = (c1 << 2) | ((c2 & 0x30) >> 4);
}
上記のコードの私の理解は次のとおりです。
func1 では、salt は構造体 BF_SALT のデータ型で定義されています。
func2 を呼び出して、構造体のソルト フィールドを渡します。
salt フィールドは、それぞれがデータ型 BF_WORD (32 ビット ワードまたは 4 バイト) の 4 つの要素の配列です。
関数 2 で
dst は、タイプ BF_WORD の要素を指す配列の名前です。
ポインター dst で型キャストを実行しています。
現在、dst はデータ型 BF_WORD を指しています。char (1 バイト データ) を指すように型キャストされます。
これで、整数 c1 と c2 に対してビットシフト演算が実行され、dptr が指すメモリ アドレスに出力が書き込まれます。そのため、dst が最初に指していたデータ (salt 配列のバイト) を上書きしています。
c1 と c2 のデータ型は int で、4 バイトのスペースが必要です。
dptr はどのように配列の内容を上書きしますか? 毎回 *dptr++ を実行するので、ポインター dptr を 1 バイト進めます。これは、文字を指しているためです。
ただし、1 バイトより大きいサイズの値を割り当てています。データはどのようにメモリに書き込まれますか?
ありがとう。