c - 如何在C中以两种不同的数据类型(uint64_t/uint8_t[8])访问相同的内存地址?

标签 c memory types

我想在 C 编程语言中访问具有两种不同数据类型的单个内存位置。

这就是我想要的方式:

我创建了一个指针并为其分配了 64 位内存。然后我想使用 uint64_tuint8_t[8] 访问该内存。

使用 unsigned long long intunsigned 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();
}

https://godbolt.org/z/hkoqFN

关于c - 如何在C中以两种不同的数据类型(uint64_t/uint8_t[8])访问相同的内存地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62328977/

相关文章:

Haskell 递归类型

在 C 中将字符串转换为 struct tm

剩余大量内存时出现 java.lang.OutOfMemoryError (94GB/200GB Xmx)

java - 对象是否有 native 类型安全的包装和拆箱?

c# - C# 7 中 "throw"表达式的编译时类型是什么?

linux - 为什么这么多的应用程序分配了大量的虚拟内存而不使用任何虚拟内存?

c - 在 GDB 中使用 ptype 设置扩展结构的深度

c - 为什么即使服务器上没有运行此类服务,getaddrinfo 也会返回服务端口?

c - 用于简单 POS 标记的 NLP 库

java - 读取浏览器内运行的Java小程序的内存