【问题标题】:What is the correct way to create a struct at a specific address in C?在 C 中的特定地址创建结构的正确方法是什么?
【发布时间】:2021-11-01 04:03:09
【问题描述】:

C++ 有一个简洁的特性,您可以在特定的内存地址创建一个对象,如shown here

这对于mmap 尤其有用,如下所示:

void *ptr = mmap(0, length, prot, flags, fd, offset);

A *ptrA = new (ptr) A;

仅使用 C 样式的结构来复制它的正确方法是什么?会是这样吗?

void *ptr = mmap(0, sizeof(A), prot, flags, fd, offset);

A *ptrA = (A*) ptr;

【问题讨论】:

  • 您只需设置地址并将其视为结构。 C 不会验证您是否正确使用了任何内存。通常写入特定地址用于写入硬件寄存器。
  • 如图所示,将从 mmap 返回的指针转换为指向所需类型的指针。
  • 仅供参考,C 中的显式转换是不必要的,因为 void 指针可以分配给任何类型的指针变量:A *ptrA = ptr;
  • @kaylum:任何对象类型,不是任何类型。

标签: c mmap


【解决方案1】:

这是有效的,因为在 C 中没有强制执行内存使用限制。

void *ptr = mmap(0, sizeof(A), prot, flags, fd, offset);

A *ptrA = (A*) ptr;

【讨论】:

  • 非常适合回答您自己的问题。请注意,如 cmets 中所述,A *ptrA = ptr; 在没有强制转换的情况下很好,因为ptr 具有 void* 类型,并且在 C 中是一个指针,并且可以在没有强制转换的情况下分配给 void* 或从 void* 分配。
猜你喜欢
  • 2014-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多