首页 > 解决方案 > 访问指针变量作为指向 C 中不同类型的指针

问题描述

通过取消引用指向不同类型的指针的指针来访问指针变量是一种好习惯void吗?这会打破严格的别名规则吗?C 和 C++ 在别名规则上存在一些差异。在这个问题中,我们专注于 C。另一个考虑 C++ 的问题可以在这里找到。在以下示例中, adouble*被作为 a 访问void*

int create_buffer(void** ptr, ...)
{
    *ptr = malloc(...);
    ...
}

int main(void)
{
    double* buffer;

    // The problematic code is here, double**
    // is coerced to void**, which is later
    // dereferenced by the function
    create_buffer((void**)&buffer, ...);
    ...
}

以下是否更好:

// keeping void** just as an indicator in the interface
// that the pointer is pointing to a pointer to any type
// it could be replaced by just void*
int create_buffer(void** ptr, ...)
{
    void* result = malloc(...);
    memcpy((void*)ptr, &result, sizeof result);
}

标签: cpointersstrict-aliasing

解决方案


不回答你的问题,但你可以通过做明确定义的事情来绕过你提到的不确定性:

int main(void)
{
  double* buffer;

  {
    void * pv;
    create_buffer(&pv, ...);
    buffer = pv; /* C does not need any cast here. */
  }

  ...

推荐阅读