将uint32数字转换为结构指针?

时间:2019-05-20 09:18:09

标签: c

在使用C时,我遇到了一些将uint32数字转换为结构指针的代码,但我无法判断这是对还是错,你们可以帮我吗?

typedef struct
{
    uint32 a;
    //some other element;
} StructA;

int main()
{
    StructA *a;
    uint32 b;
    b = //assign a value for b;
    a = (StructA*)b;
}

这种类型的b指向StructA的指针正确吗?并且请向我解释为什么这是对还是错,非常感谢您的帮助

3 个答案:

答案 0 :(得分:0)

这段代码正在做的是将整数转换为指针类型。这是语言对这种转换的评价:

  

6.3.2.3 Pointers
  ...
  5。整数可以转换为任何指针类型。除先前指定外,   结果是实现定义的,可能未正确对齐,可能未指向   引用类型的实体,并且可能是陷阱表示。

因此,您必须查看实现的文档(即编译器),以查看是否允许这样做。请注意,此代码不可移植,很可能导致不确定的行为。

答案 1 :(得分:0)

 I have encounterd some code which typecase an uint32 number to struct pointer

struct的第一个成员的地址和struct本身可以互换:

void foo(uint32 *u)
{
    ((StructA *)u)->a = 10;
}

StructA t;
foo((uint32 *)&t);

但这并不意味着您可以使用具体类型来初始化struct

a = (StructA*)b;

您使用整数初始化指针,因此a指向垃圾(一些随机地址)。

这样做没有问题:

a = (StructA*)&b; // notice the address-of operator

因为ab具有相同的对齐要求,并且它们可以互换,但是,尝试访问a->someOtherElement是不确定的行为。

答案 2 :(得分:-1)

通常,将值从整数类型转换为指针并取消对指针的引用只有在这两个条件都为真时才有意义:

  • 该体系结构允许整数类型表示指针的值
  • 该值是从相同类型的结构的地址获得的。

例如在32位体系结构上,这是合法的C:

StructA *a;
StructA other {};
uint32_t b;
...
b = (uint32_t) &other;
a = (StructA*) b;

另一个有效的用例更具约束力。某些体系结构可能具有映射到众所周知地址的特定寄存器。在这种情况下,这也是合法的:

StructA *a;
StructA other {};
uint32_t b;
...
b = (uint32_t) ...;  // well known address on a specific machine and a specific compiler
a = (StructA*) b;

要求是:

  • 机器从该知名地址开始有特定的寄存器
  • 具体实现将这些寄存器映射到*StructA类型的结构,没有填充问题