【问题标题】:Can I treat size_t as a void pointer?我可以将 size_t 视为 void 指针吗?
【发布时间】:2021-09-25 16:59:30
【问题描述】:

我正在使用将void* 存储在队列中的外部库。例如,

void queue_insert(Queue* queue, void* data);

但是,我想将 size_t 数据存储在队列中。我无法传递size_t 数据的地址(因为它是本地范围的)。不过,我再也不需要访问数据了。

换句话说,我将调用这些函数

queue_insert(queue, 5);
bool exists = queue_contains(queue, 5);

但我永远不会做以下事情(因为这没有意义)

void* p = queue_pop(queue);
size_t s = *p;

话虽如此,我可以将size_t 变量传递给采用void* 的函数吗?

【问题讨论】:

  • "我可以将 size_t 变量传递给一个接受 void* 的函数吗" --> 从一个到另一个的转换可能会丢失信息。 sdasdadas,您的应用程序可以吗?代码的可移植性如何?
  • 没有完全的可移植性,你不能,但在许多实现中,它可能会被记录或接受实践。
  • sdasdadas, size_t --> void * --> size_t 未在 C 中指定以返回原始 size_t。它可能适用于某些值,可能不会。
  • uintptr_t 在这里帮不了你;保证您可以将指针存储在uintptr_t 中并将其取回,但反之则不行。 AFAIK 获得完全可移植性的唯一方法是为您的size_t 提供malloc 空间,存储指针,稍后释放它。
  • @NateEldredge void * --> uintptr_t --> void * 被指定为产生一个 equivalent 指针,但不一定是相同的位模式。您的malloc() 想法不错。

标签: c pointers void-pointers


【解决方案1】:

通常,当通用库提供队列管理、排序、生成线程等算法时,void * 参数本质上意味着“我会处理你想要的任何东西。把它放在内存中,然后给我一个指向它的指针。你需要的时候我会给你指路的。”

这通常与结构一起使用。需要管理传递给线程的作业信息,例如开始和结束索引、配置参数等等?定义结构类型,为其分配内存,将内存地址传递给库的void * 参数。但它也可以与标量项目一起使用。

要传递size_t,使用mallocsize_t分配空间,将值放入分配的空间,并将地址传递给queue_insert

当你弹出一个元素时,使用size_t *s = queue_pop(queue);。那么*s 就是你存储的size_t。当你使用它时,使用free(s)释放内存。

【讨论】:

  • 这是我通常使用它们的方式,并且效果很好。但是,我正在运行一个循环,该循环会在每次迭代时生成新的结构。这些结构在每次迭代的开始和结束时都被 malloc 和销毁。有功能等效的结构具有不同的指针引用。真的,我希望库有一个自定义比较运算符用于void* 条目。
猜你喜欢
  • 2015-01-15
  • 2021-02-02
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 1970-01-01
  • 2016-03-20
  • 1970-01-01
  • 2015-04-25
相关资源
最近更新 更多