【发布时间】:2019-04-24 17:29:41
【问题描述】:
我的代码如下所示
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 值。请任何人提供帮助并提供解决此问题的想法。
【问题讨论】:
-
您不能以您的方式分配给指针(即
sptr)。有关原因,请参阅 Roflcopter4 的答案。我想我理解你最终想要做什么。请在此处查看我的答案:stackoverflow.com/a/52749660/5382650 了解实现目标的不同方法。 -
是否编译——初始化是否编译?
-
是的,它可以编译。面临的问题是使用通用指针访问结构元素,因为结构具有不同大小的不同数据类型。因此,根据结构中其他元素的各个数据类型,每个数据位于矩阵中的不同位置。因此,如果我们在结构中添加更多元素或改变现有元素的任何数据类型,这将有所不同。我们可以推导出一些可以解决这个问题的公式。但似乎有点不可能。否则我们应该有一个指针数组,在这种情况下,每个指针分别指向结构的每个元素。
-
将
tptr转换为uint16 *并加1,可能意味着您正在读取x 的高2 个字节。写*( (uint16*)tptr+2 )看看会发生什么,尽管这通常不是你写dereferencing的方式。 -
为什么不使用联合?
标签: c pointers structure void-pointers dereference