C指向结构的双指针

时间:2011-10-03 17:40:23

标签: 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\n", (*data)->member);
}

这里有一个类似的问题:How to work with pointer to pointer to structure in C?关于如何通过双指针修改结构的成员。解决方案是语法(*data)->member = 1;,这是有道理的。但在我的小应用程序中,我在执行该行时收到了seg错误。我究竟做错了什么?

由于

6 个答案:

答案 0 :(得分:18)

如果要取消引用指针,则需要指向某些内容。试试这个:

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

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

答案 1 :(得分:7)

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

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

您需要先分配mystruct类型的对象。以下是您的工作示例:http://ideone.com/XIdJ8

答案 2 :(得分:5)

data未初始化,因此未指向任何合理的内存地址。此外,没有mystruct结构浮动,所以甚至没有任何明智的数据可以指向。对于您的示例,您希望:

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

答案 3 :(得分:1)

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

我从未使用过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;

答案 4 :(得分:0)

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

这可能更有用:

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

答案 5 :(得分:0)

或者你可以试试这个:

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

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