gpt4 book ai didi

c - 使用类型定义的数据类型取消引用通用指针

转载 作者:行者123 更新时间:2023-12-01 14:36:22 24 4
gpt4 key购买 nike

我的代码如下所示

typedef unsigned short  uint16;

struct STR
{
const int x;
const uint16 y;
const int z;
void* sptr;
};

struct STR s2[2] =
{
{1, 4, 6, {&s2[0].x, &s2[0].y, &s2[0].z}},
{10,40, 60, {&s2[1].x, &s2[1].y, &s2[1].z}}
};

int main()
{
void* tptr = s2[0].sptr;
printf("%d %d %d", *((int*)tptr), *( (uint16*)tptr+1 ), *((int*)tptr+2));
return 0;
}

这里我使用了一个 void 指针,因为我将从结构中引用不同的数据类型。这里我期望得到的输出是

预期输出:1 4 6

但是如果我使用

printf("%d %d %d", *((int*)tptr), *( (uint16*)tptr+1 ), *((int*)tptr+2));

我得到的输出为 1 0 6。这里我使用了类型定义的数据类型 uint16 进行引用。

相反,如果我使用

printf("%d %d %d", *((int*)tptr), *( (int*)tptr+1 ), *((int*)tptr+2));

我得到的正确输出为 1 4 6。为什么 uint16 类型无法取消引用指针并获得 0 值。请任何人提供帮助并提供解决此问题的想法。

最佳答案

我在这里看到了一些问题。首先,你不能声明这样的结构。 void * 变量是一个指针。您正试图在其位置定义整个结构,并使用不正确的语法来做到这一点。我很惊讶编译器没有拒绝代码。

您显然需要定义一个结构,该结构也接受 3 个整数指针作为值。如果你真的想像那样一次性声明所有内容,并将第四个元素作为指针,你可以使用这样的复合文字:

#pragma GCC diagnostic ignored "-Wmissing-braces"
struct other_struct {
const int *x;
const uint16 *y;
const int *z;
};
struct STR s2[2] = {
{1, 4, 6, (struct other_struct[1]){&s2[0].x, &s2[0].y, &s2[0].z}},
{10,40, 60, (struct other_struct[1]){&s2[1].x, &s2[1].y, &s2[1].z}}
};

请注意,编译器可能会拒绝文件范围内的复合文字(我认为 MSCV 会拒绝)。

您似乎也是此处填充的受害者。编译器将始终尝试将结构中的数据对齐到机器字长的倍数(64 位为 8 字节),除非您明确告诉它不要这样做。此外,事物通常排成至少 4 字节的边界(整数的大小)。因为你正在做的是完全未定义的行为,你的编译器只是试图通过给每个元素一个整数的大小来扩展结构。当您尝试查看结构中的下一个 int16 时,您向前看 2 个字节,但下一个值实际上提前 4 个字节,因此您得到的值为 0。这也解释了为什么它在转换为 时有效int *.

编辑:实际上我在上面犯了一个错误。对不起。您的代码未按预期工作,不一定是因为填充,而是因为您编写指针算法 的方式。试图以这种方式在原始数组中查找元素确实是不可能的,而且在任何情况下肯定都是未定义的行为。

关于c - 使用类型定义的数据类型取消引用通用指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53424034/

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