我想在 C 编程语言中访问具有两种不同数据类型的单个内存位置。
这就是我想要的方式:
我创建了一个指针并为其分配了 64 位内存。然后我想使用 uint64_t
或 uint8_t[8]
访问该内存。
使用 unsigned long long int
和 unsigned char
是不正确的,因为 sizeof(unsigned char)==sizeof(uint8_t)
不正确永远正确。
我有一种感觉,循环和复制内存并不是真正需要的,我认为两者都
uint64_t abc = { 0xdeadbeefcafe1337 }
和
uint8_t[8] xyz = { 0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe, 0x13, 0x37 }
在内存中看起来是一样的。
编辑:但是为什么呢?
我希望能够更轻松地对 int 进行简单加法,并且我还希望以简单的类似数组的方式、单字节时间访问该 int 值。
最佳答案
你可以使用 union 来实现
typedef union
{
uint64_t u64;
uint32_t u32[2];
uint16_t u16[4];
uint8_t u8[8];
}u64;
void foo(void)
{
u64 u;
u.u64 = 0xdeadbeefcafe1337ULL;
for(size_t i = 0; i < sizeof(u.u64); i++)
{
printf("byte %02d - 0x%hhX\n", i, u.u8[i]);
}
}
void foo(void)
{
u64 u;
u.u64 = 0xdeadbeefcafe1337ULL;
for(size_t i = 0; i < sizeof(u.u64); i++)
{
printf("byte %02d - 0x%hhX\n", i, u.u8[i]);
}
}
void bar(void)
{
u64 *u = malloc(sizeof(*u));
u -> u64 = 0x1337cafebeefdeadULL;
for(size_t i = 0; i < sizeof(*u); i++)
{
printf("byte %02d - 0x%hhX\n", i, u -> u8[i]);
}
free(u);
}
int main(void)
{
foo();
printf("-----------------------\n");
bar();
}
关于c - 如何在C中以两种不同的数据类型(uint64_t/uint8_t[8])访问相同的内存地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62328977/