gpt4 book ai didi

c - 使用指针访问 long long 变量中的字节

转载 作者:太空狗 更新时间:2023-10-29 15:50:03 26 4
gpt4 key购买 nike

我应该创建一个变量

long long hex = 0x1a1b2a2b3a3b4a4bULL;

然后定义4个指针,分别指向1a1b、2a2b、3a3b和4a4b。然后我打印那些双字节的地址和值。

我的方法是创建一个指针

long long *ptr1 = &hex;

然后使用指针运算得到下一个值。我意识到增加这个指针会增加 long long 字节,而不是像我需要的那样增加 2 个字节。创建一个短指针

short *ptr1 = &hex;

这是我需要的,但我的编译器不允许,因为数据类型不兼容。我该如何解决这个问题?有没有办法创建一个递增 2 个字节的指针并将其分配给更大数据类型的变量?

最佳答案

您只能通过兼容类型访问任何变量。

但是,char 指针可用于访问任何类型的变量。

请不要将其转换为 short* 请参阅下面的注意事项,它们是不兼容的类型.您只能将 char* 用于符合规范的代码。

引用 C11,章节 §6.3.2.3

[...] When a pointer to an object is converted to a pointer to a character type, the result points to the lowest addressed byte of the object. Successive increments of the result, up to the size of the object, yield pointers to the remaining bytes of the object.

所以,出路是,使用 char * 并使用指针算法来获取所需的地址。


注意:由于所有其他答案都提出了一个明显错误的方法(将指针转换到 short *,这明显违反了严格的别名),让我扩展一下我的答案和支持引号.

引用 C11,章节 §6.5/P7

An object shall have its stored value accessed only by an lvalue expression that has one of the following types: 88)

— a type compatible with the effective type of the object,

— a qualified version of a type compatible with the effective type of the object,

— a type that is the signed or unsigned type corresponding to the effective type of the object,

— a type that is the signed or unsigned type corresponding to a qualified version of the effective type of the object,

— an aggregate or union type that includes one of the aforementioned types among its members (including, recursively, a member of a subaggregate or contained union), or

— a character type.

在这种情况下,shortlong long 不是兼容 类型。所以唯一的出路是使用 pointer tochar` 类型。


从问题正文中剪切粘贴

这是由 OP 作为更新添加的

编辑:这是不会导致未定义行为的正确解决方案。编辑 2:添加了内存地址。

#include <stdio.h>
int main() {
long long hex = 0x1a1b2a2b3a3b4a4bULL;
char *ptr = (char*)&hex;
int i; int j;
for (i = 1, j = 0; i < 8, j < 7; i += 2, j += 2) {
printf("0x%hx%hx at address %p \n", ptr[i], ptr[j], (void *) ptr+i);
}
return 0;
}

关于c - 使用指针访问 long long 变量中的字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44308114/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com