gpt4 book ai didi

c - 如何使指针指向两个或多个连续的单元格

转载 作者:太空狗 更新时间:2023-10-29 15:02:04 25 4
gpt4 key购买 nike

假设我有一个 uint8_t 指针指向数组中的第三个元素 {1, 2, 4, 5} 所以 *p 是 4。我怎样才能让它指向 4 和 5,这样 *p 就是 45。这有可能吗?我目前正在打字。这是我所做的,例如如果数据是我的数组 {1, 2, 4, 5} 并且我想得到 4 和 5。

uint8_t dummyAddress = data[2]; 
dummyAddress = *((uint16_t*) dummyAddress);
*p = *dummyAddress;

我的理解是 p 现在应该指向 4 和 5,但我没有。相反,当我执行第二行时出现段错误。 p 是一个 uint64_t * const。它可以获取一个字节,但是当对两个字节应用相同的逻辑时,我做错了。

最佳答案

你可以这样做:

uint8_t data[] = { 1, 2, 4, 5 };
uint8_t *p8 = &data[2];
uint16_t u16 = *(uint16_t*)p8;

然后 (uint16_t*)p8 将指向 data[2]data[3]。但是您无法轻松访问 *(uint16_t*)p8。首先,这是因为 p8 可能未在 uint16_t 边界上对齐。在这种情况下,某些处理器会导致异常。其次,即使您可以访问 *(uint16_t*)p8,您也可能会根据处理器的字节顺序(大端/小端)获得不同的结果。您可能会得到 0x0405,也可能会得到 0x0504。

另请注意,在您的行中

dummyAddress = *((uint16_t*) dummyAddress);

您首先将 dummyAddress 重新解释为指向 uint16_t 的指针,然后取消引用它,因此返回一个 uint16_t 并将其存储在 中虚拟地址。这显然不是您想要做的。如果这真的可以编译,请考虑使用更高的警告级别进行编译,并查看每个编译器警告(只有在您理解并确定它不是编程错误时才忽略它)。

顺便说一句,您将无法获得指针 p where *p==45 正如您在问题中所要求的那样。

另外,正如 mch 所说:What is the strict aliasing rule?

关于c - 如何使指针指向两个或多个连续的单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33504773/

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