我正在尝试找出一个指向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错误。我究竟做错了什么?
由于
答案 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
结构浮动,所以甚至没有任何明智的数据可以指向。对于您的示例,您希望:
mystruct
。答案 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++ 中对我有用,不需要指向另一个变量。