【问题标题】:Assign pointer-to-pointer to a pointer to a pointer inside a struct将指针指向指针分配给指向结构内指针的指针
【发布时间】:2018-05-16 00:16:39
【问题描述】:

我正在编辑别人的代码并试图理解它。该函数传入一个参数void **dst_val。我不擅长指针。我查看了所有有关堆栈溢出的远程相关帖子,但没有找到我要查找的内容。

我有一个结构:

typedef struct {
  u_int img_out_len;
  char *img_out_val;
} img_out;

我声明了一个指向结构的指针:

img_out *clnt_res;

并为其分配内存。

现在,我很困惑。我需要将void **dst_val 设置为指向结构指针内的img_out_val 指针,但我无法弄清楚语法。为什么这些不正确,什么是正确的?

dst_val = (void *)(*clnt_res).img_out_val; //wrong

dst_val = (void **)clnt_res->img_out_val; //wrong

我还应该注意img_out_val 指向二进制文件的数据。


编辑:

由于函数传入void **dst_val,我需要它在函数返回时指向二进制数据。

【问题讨论】:

  • void **img_out * 不兼容。所以做任何类似的事情都会引发未定义的行为。
  • 对不起,它是 typdefed,我应该把它包括在内。

标签: c pointers struct void-pointers


【解决方案1】:

如果 frslm 的 anser 不够好,你也可以试试

&(void*)clnt_res->img_out_val;

【讨论】:

    【解决方案2】:

    由于clnt_res->img_out_val 为您提供char *,您需要在将其转换为void ** 之前获取该地址(以char ** 结尾):

    (void **)&clnt_res->img_out_val;
    

    【讨论】:

    • 这是未定义的行为。
    • @EugeneSh。 cast-to-void ** 部分?
    • void ** 不兼容 void ** 以外的任何内容。不要与void*混淆
    • 谢谢尤金,我想要完成的正确方法是什么?
    • @Eugene Sh.:究竟什么是未定义行为?在 C 中,您可以将任何数据指针转换为任何其他数据指针类型。转换本身没有未定义的行为。
    【解决方案3】:

    假设你必须打电话

    void foo(void ** ppv);
    

    然后要解决任何铸造问题/问题,请这样做:

    {
      void * pv = &clnt_res->img_out_val;
      foo(&pv);
    }
    

    甚至更短:

    {
      foo(&((void*){&clnt_res->img_out_val}));
    }
    

    请注意,上面的void* 确实不是表示强制转换,而是定义了void* 类型的复合文字。

    【讨论】:

      猜你喜欢
      • 2014-08-23
      • 1970-01-01
      • 2016-03-21
      • 2012-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多