【问题标题】:Is it possible to have the same array of pointers to struct point to different types of struct?是否可以将相同的指向 struct 的指针数组指向不同类型的 struct?
【发布时间】:2020-12-31 08:04:19
【问题描述】:

我正在使用指向结构的指针,并进行了以下设置。

/* Initialized. */
struct base { ... };  
struct base **db;
db = malloc( base_max * sizeof *db );

/* When a new struct base is required. */
db[ i ] = malloc( sizeof( struct base ) );

现在,如果可能,虽然不是很重要,但我只希望db[0] 指向不同的结构struct mem { ... }。这可能吗?正确的方法是什么?

我想我可以设置db[0] = malloc( sizeof( struct mem ) );但是db 已经被声明为指向一个指向struct base 的指针;而db的内存分配也是基于此。

我很困惑,因为我读到的指针必须有类型,否则指针算术将无法正常工作;但我也读到你不必从 malloc 转换指针,即使它返回 void 指针。


关于重复的问题,尽管它讨论了 void 类型,但它并没有回答我关于如何完成此操作或其风险的问题。 @4386427 的评论似乎指向要考虑的真正问题,该问题未在其他问题或对此问题的一个答案中解决。谢谢。

【问题讨论】:

  • db[0] = malloc( sizeof( struct mem)); 没有错,是合法的.... 是否会遇到问题,取决于您以后如何使用db[0]。由于您没有发布该代码,我们无法判断
  • 我相信这个问题隐含地讨论了指向 void 的指针。如果您不同意,请告诉我,但基于该假设,我建议重复以下内容:
  • 你也可以使用这两种类型的并集
  • @4386427 谢谢,这是最有意义的。 db[i>0] 是一组指向 sqlite 数据库的指针,一组准备好的语句,一个目录路径的 char 数组,然后是一个常规的 int(无指针)。 db[0] 是内存数据库,准备好的语句较少,没有路径。最好将db[0] 单独保留在指针数组之外,并避免在其他地方出现意外错误的风险。出于好奇,db[0] + sizeof(struct mem) 会指向db[1]db[1] + sizeof(struct base) 会指向db[2],就像字符数组一样?谢谢。

标签: c pointers struct


【解决方案1】:

在大多数架构中,指针(指向任何类型)的大小是恒定的,并且任何指针类型通常会占用相同数量的内存。

除非您在一些非常不常见的硬件/平台上,否则您可以使用由 malloc() 返回的任何指针分配 db[0],并使用完全用于大小计算的不同结构类型。

 db[0] = malloc( sizeof( struct mem ));

应该会很好,您只需要担心内存泄漏,因为您将覆盖 malloc() 返回的先前内存位置。

但是,由于您存储的是指向不同类型内存的指针,因此在使用 db[0] 时,即取消引用它,您需要先将其转换为正确的指针类型(即 struct mem*)根据struct mem 类型使用指针访问/操作。

也就是说,

我很困惑,因为我读到的指针必须有类型,否则指针运算将无法正常工作;

没错

但我还读到你不必从 malloc 中转换指针,即使它返回 void 指针。

同样如此,当您将指针分配给某种类型的变量(void 除外)时,转换是隐式的。您可以使用该变量来执行指针运算。

【讨论】:

  • void * 可以在任何平台上转换为struct foo *。此外,malloc 分配的空间在第一次写入之前是无类型的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-26
  • 2015-02-19
  • 1970-01-01
相关资源
最近更新 更多