我正在阅读 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 中,盐是用结构 BF_SALT 的数据类型定义的。
我们正在调用 func2,传递结构的盐域。
salt 字段是一个包含 4 个元素的数组,每个元素的数据类型为 BF_WORD(32 位字或 4 个字节)
在 func2 中
dst 是指向 BF_WORD 类型元素的数组的名称。
它正在对指针 dst 执行类型转换。
目前,dst 指向数据类型 BF_WORD。它是类型转换的,因此它指向一个 char(1 字节数据)。
现在它正在对整数 c1 和 c2 执行位移操作,并将输出写入 dptr 指向的内存地址。因此,它正在覆盖最初由 dst 指向的数据(盐数组中的字节)。
c1 和 c2 的数据类型为 int,需要 4 个字节的空间。
dptr 会以什么方式覆盖数组的内容?因为每次我们执行 *dptr++,我们都将指针 dptr 前进 1 个字节,因为它指向一个字符。
但是,我们为它分配了一个大于 1 字节的值。数据将如何写入内存?
谢谢。