C双指针结构

C双指针结构,c,pointers,data-structures,struct,C,Pointers,Data Structures,Struct,我正试图计算出一个指向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

我正试图计算出一个指向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);
}
这里提出了一个类似的问题:如何通过双指针修改结构的成员。解决方案是语法
(*data)->member=1这很有意义。但在我这里的小应用程序中,我在执行该行时收到一个seg错误。我做错了什么


谢谢

您收到了一个SEGFULT,因为您没有分配结构

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


您需要首先分配类型为
mystruct
的对象。下面是一个工作示例:

数据未初始化,因此不指向任何合理的内存地址。此外,没有浮动的
mystruct
结构,因此实际上甚至没有任何可指向的合理数据。例如,您希望:

  • 创建一个
    mystruct
  • 做一个指向它的指针
  • 创建指向该指针的指针

  • 如果要取消对指针的引用,则需要指向某个对象。试试这个:

    void main(int argc, char *argv)
    {
        mystruct actualThing;
        mystruct *pointer = &actualThing;
        mystruct **data = &pointer;
        myfunc(data);
    
        printf("Member: %d", (*data)->member);
    }
    

    你正在传递一个指针,但指针没有指向任何东西

    这可能更有用:

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

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

    我从未使用过libusb,因此我将给出一个使用标准库函数的示例。从手册页:

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

    Quantity: 99;    Description: RED BALLOONS;
    

    或者你可以试试这个:

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

    这对C++来说是有效的,不需要指出另一个变量。

    分配,对于一个被问及的问题,+1。通常,唯一的理由是使用指向结构指针的指针,函数需要改变指针所在的位置。例如,如果
    myfunc
    正在分配
    mystruct
    的实例,或者可能从列表/队列/etc中检索它们,这是有意义的。但是,如果您只是在操作结构的内容,那么就没有理由使用“双指针”。为了给它添加一些上下文,我不会尝试创建它。我正在尝试使用libusb-1.0创建一个USB接口。其中一个库函数需要指向结构的双指针作为参数。所以我想弄清楚我该怎么做。不过,每个人都死死地想着自己的反应。谢谢哇,真不敢相信我没想到。所有这三个回答都是正确的。这只是人类众多缺陷中的一个。但我们都生活和学习:)
    void main(int argc, char*argv[])
    {
       mystruct *data;
       myfunc(&data);
       printf("member = %d\n", data->member);
    }