【问题标题】:C Double Pointer to StructureC 指向结构的双指针
【发布时间】:2011-11-30 02:48:49
【问题描述】:

我正在尝试在 C 中计算出一个指向结构的双指针,但无法弄清楚出了什么问题......简单的来源如下:

typedef struct
{
    int member;
} mystruct;

void myfunc(mystruct **data)
{
    (*data)->member = 1;
}

void main(int argc, char *argv[])
{
    mystruct **data;

    myfunc(data);

    printf("member = %d\n", (*data)->member);
}

这里问了一个类似的问题:How to work with pointer to pointer to structure in C? on how to modify a member of a structure through a double pointer。解决方案是语法(*data)->member = 1;,这是有道理的。但是在我的小应用程序中,执行该行时收到段错误。我究竟做错了什么?

谢谢

【问题讨论】:

  • 抛开分配,+1 提出一个很好的问题。
  • 通常,使用指向结构指针的指针的唯一原因是函数需要更改指针指向的位置。例如,如果myfunc 正在分配mystruct 的实例,或者可能从列表/队列/等中检索它们,这将是有意义的。但是,如果您只是在操作结构的内容,则没有理由使用“双指针”。
  • 为了说明这一点,我并不是要创建它。我正在尝试使用 libusb-1.0 创建一个 USB 接口。其中一个库函数需要一个指向结构的双指针作为参数。所以我试图弄清楚我将如何提供它。不过,每个人都对自己的反应死心塌地。谢谢!

标签: c pointers data-structures struct


【解决方案1】:

如果你要取消引用一个指针,你需要指向一些东西。试试这个:

void main(int argc, char *argv)
{
    mystruct actualThing;
    mystruct *pointer = &actualThing;
    mystruct **data = &pointer;
    myfunc(data);

    printf("Member: %d", (*data)->member);
}

【讨论】:

    【解决方案2】:

    您收到一个段错误,因为您没有分配结构。

    data 的值是垃圾,因此它指向内存中不属于您的进程或无法访问的某个位置。

    您需要首先分配一个mystruct 类型的对象。这是一个适合您的工作示例:http://ideone.com/XIdJ8

    【讨论】:

      【解决方案3】:

      data 未初始化,因此不指向任何合理的内存地址。此外,没有mystruct 结构在四处飘荡,因此实际上甚至没有任何明智的数据可以指向。对于您的示例,您希望:

      1. 创建mystruct
      2. 创建一个指向它的指针。
      3. 创建一个指向该指针的指针。

      【讨论】:

      • 哇,真不敢相信我没想到。所有这 3 个答复都是正确的。
      • 这只是人类的众多缺陷之一。但我们都生活和学习:)
      【解决方案4】:

      如果只需要将双指针传递给库函数,则无需为其创建变量。您创建一个普通指针变量,将其初始化为指向适当的存储(如果函数需要),然后传递指针的地址(从而“动态”创建双指针)。

      我从未使用过 libusb,所以我将举一个使用标准库函数的示例。从手册页:

         #include <stdlib.h>
      
         long int strtol(const char *nptr, char **endptr, int base);
      

      它只是看起来像一个双指针。它实际上是一个模拟的按引用传递的单指针。允许函数返回除了其正常返回值之外的额外信息。 strtol 返回一个长整数,但它也可以告诉你字符串内容在什么时候不再看起来像一个数字。

      #include <stdio.h>
      #include <stdlib.h>
      
      int main(void) {
          char *str = "99RED BALLOONS";
          char *what;
          long num;
      
          num = strtol(str, &what, 10);
          printf("Quantity: %ld;    Description: %s;\n", num, what);
      
          return 0;
      }
      

      输出:

      Quantity: 99;    Description: RED BALLOONS;
      

      【讨论】:

        【解决方案5】:

        你传递给它一个指针,但指针没有指向任何东西。

        这可能更有用:

        void main(int argc, char *argv[])
        {
            mystruct data;
            mystruct *ptr = &data;
            myfunc(&ptr);
            printf("member = %d\n", (*ptr)->member);
        }
        

        【讨论】:

          【解决方案6】:

          或者你可以试试这个:

          void main(int argc, char*argv[])
          {
             mystruct *data;
             myfunc(&data);
             printf("member = %d\n", data->member);
          }
          

          这在 C++ 中适用于我,不需要指向另一个变量。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-11-15
            • 2021-07-14
            • 1970-01-01
            • 2017-01-04
            • 2019-01-18
            • 1970-01-01
            • 2021-01-12
            • 2016-08-25
            相关资源
            最近更新 更多