C指向结构的双指针
我试图找出一个指向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;
这是有道理的。 但是在我的小应用程序中,我在执行该行时收到了seg错误。 我究竟做错了什么?
谢谢
如果要取消引用指针,则需要指向某些内容。 试试这个:
void main(int argc, char *argv) { mystruct actualThing; mystruct *pointer = &actualThing; mystruct **data = &pointer; myfunc(data); printf("Member: %d", (*data)->member); }
您收到了段错误,因为您没有分配结构。
data
的值是垃圾,因此它指向内存中不属于您的进程的某个位置,或者指向其他位置无法访问。
您需要先分配一个mystruct
类型的对象。 以下是您的工作示例: http : //ideone.com/XIdJ8
data
未初始化,因此不指向任何合理的内存地址。 此外,没有浮动的mystruct
结构,所以甚至没有任何明智的数据可以指向。 对于您的示例,您希望:
- 创建一个
mystruct
。 - 指向它。
- 指向该指针。
如果只需要将双指针传递给库函数,则无需为其创建变量。 你创建一个普通的指针变量,初始化它指向适当的存储(如果函数需要),然后传递指针的地址(从而“动态”创建双指针)。
我从未使用过libusb,因此我将使用标准库函数给出一个示例。 从联机帮助页:
#include long int strtol(const char *nptr, char **endptr, int base);
它看起来只是一个双指针。 它实际上是一个模拟传递引用的单指针。 允许函数返回除正常返回值之外的额外信息。 strtol
返回一个长整数,但它也可以告诉你字符串内容在什么时候停止看起来像一个数字。
#include #include 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;
你传给它一个指针,但指针没有指向任何东西。
这可能更有用:
void main(int argc, char *argv[]) { mystruct data; mystruct *ptr = &data; myfunc(&ptr); printf("member = %d\n", (*ptr)->member); }