C语言中的双重指针结构体

28

我正在尝试在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);
}

这里曾经有一个类似的问题: 如何在C语言中使用指向指针的结构体?,它涉及通过双重指针修改结构体成员。解决方案是使用语法(*data)->member = 1;,这很有道理。但在我的小应用程序中,执行该行代码时会收到段错误。我做错了什么?谢谢。

4
撇开分配不谈,赞一个好问题。 - Kelly S. French
2
通常情况下,你使用指向结构体指针的指针的唯一原因是函数需要改变指针所指的位置。例如,如果myfunc正在分配mystruct实例或从列表/队列等中检索它们,那么这是有意义的。但是,如果你仅操作结构体的内容,则没有使用“双重指针”的必要。 - Brian McFarland
1
为了解释一下,我并不是在尝试创建这个。我正在尝试使用libusb-1.0创建一个USB接口。其中一个库函数需要一个结构体的双重指针作为参数。因此,我正在努力想出如何提供它。不过,每个人的回答都非常准确。谢谢! - linsek
6个回答

24

如果你要引用一个指针,就需要指向某个东西。尝试这样做:

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

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

7

你收到了段错误是因为你没有分配一个结构体。

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

你需要首先分配一个 mystruct 类型的对象。这里为您提供一个可行的示例: http://ideone.com/XIdJ8


5

data未初始化,因此不指向任何合理的内存地址。此外,没有浮动的mystruct结构,因此甚至没有任何合理的数据可以指向。对于你的示例,你需要:

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

1
哇,真不敢相信我没想到那个。这三个回复都是正确的。 - linsek
1
这只是人类中的许多错误之一。但我们都在不断地学习和成长 :) - gspr

1
如果您只需要将双指针传递到库函数中,您不需要为其创建变量。您可以创建一个普通指针变量,将其初始化为指向适当的存储(如果函数需要),然后传递指针的地址(从而“即时创建”双指针)。
我从未使用过libusb,因此我将举一个使用标准库函数的例子。来自man手册:
   #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;

1
或许你可以尝试这个:

或者你可以尝试这个:

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

这对我在C++中有效,不需要指向另一个变量。

0

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

这可能更有用:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接