我已经看过很多其他问题,但是我仍然似乎无法弄清楚如何初始化指向同时也是指针的struct成员的指针。给定指向结构的指针(包含一个指针成员),我想初始化一个指向该成员指针的指针。
例如,当将节点添加到链表中时,在我所学习的示例中给出的参数是addNode(** head等)。我想知道是否需要为该指针分配内存,以及如果我在下面的代码中做错了该如何初始化它。
int row, col;
double val;
char nwln;
sp_tuples_node ** tuplepointer/* = malloc(sizeof(sp_tuples_node *));*/
FILE * inFile = fopen(input_file, "r");
sp_tuples * new_tuples = malloc(sizeof(sp_tuples));
tuplepointer = new_tuples->tuples_head;
fscanf(inFile, "%d %d%c", &row, &col, &nwln);
//while not eof
fscanf(inFile, "%d %d %d%c", &row, &col, &val, &nwln);
addNode(tuplepointer, row, col, val);
return new_tuples;
有问题的行用换行分隔,其余未完成的代码在此处用于调用该函数,因此应忽略其功能。
感谢您对如何将指针分配给作为指针的成员的任何反馈。
无论何时声明类型pointer-to-pointer-to type
,您都需要two分配,然后才能使用通过以下方式引用的任何pointer-to-pointer>]type
pointer-to-pointer-to type
(或至少分配一个指针,然后将现有对象分配给每个分配的指针)。
例如,您的声明:
sp_tuples_node **tuplepointer;
(假定
std_tuples_node
不是类型有效的指针)
您需要做的是:
type
地址的单指针。如果要引用所引用类型对象的50
,则必须分配50
指针,以便tuplepointer
指向包含50
指针的内存块,该指针用于键入sp_tuples_node
。 tuplepointer = malloc (50 * sizeof *tuplepointer); /* allocate 50 pointers */
if (!tuplepointer) { /* validate allocation */
perror ("malloc-tuplepointer");
exit (EXIT_FAILURE);
}
sp_tuples_node
分配存储,并为分配给上述50
的内存块中的tuplepointer
指针之一分配的每个块分配起始地址。 for (size_t i = 0; i < 50; i++) {
tuplepointer[i] = malloc (sizeof *tuplepointer[i]);
if (!tuplepointer[i]) {
perror ("malloc-tuplepointer[i]");
exit (EXIT_FAILURE);
}
}
(<< [note:如果您始终使用
dereferenced指针来设置要分配的类型的typesize,您将永远不会出错typesize)现在您已经为50
指针分配了存储,并将起始地址分配给tuplepointer
。您还为50 - sp_tuples_node
分配了存储,并且已将每个地址的起始地址分配给了分配给50
的块中的tuplepointer
指针之一,可以使用array-index
如果tuplepointer[i]
包含另一个指向某种类型的指针作为该结构的成员,则您现在可以分配一个存储块,并为该指针分配起始地址。假设您有sp_tuples_node
作为char *str;
的成员。然后,您可以分配:
sp_tuples_node
等等,依此类推...您可以根据需要执行多次。您唯一需要保持直觉的想法是是分配指针还是为对象分配存储空间。显然,对于
pointer-to-pointer-to
size_t len = strlen(somestring);
tuplepointer[i]->str = malloc (len + 1); /* allocate storage for str, assign to ptr */
/* validate allocation ... */
memcpy (typlepointer[i]->str, somestring, len + 1);
,您正在分配指针,当您取消引用一次并需要分配pointer-to-pointer->] 带有type
时,您正在为对象分配存储。] >您如何保持笔直?这样想吧。当您取消引用要分配的类型时-您拥有什么?pointer-to-pointer-to
type
,在取消引用后,您具有
type
(正在分配指针)] >>使用pointer-to type
,在取消引用时,您具有type
(正在分配对象)] >>type
。那不一样在这种情况下,您可能在呼叫者中(例如addNode(**head, etc)
)main()
node *head;
这里的参数类型是
pointer-to-pointer-to
addNode (&head, etc);
,因为您要在head
中传递原始指针的address of
。main()
本身已经有一个有效的地址,因此您无需分配head
本身。您传递head
,以便函数&head
接收原始指针的地址,而不是copy-of指针。这样,如果您需要为通过addNode
引用的节点分配存储,则可以分配head
,并且在函数返回时*head = malloc (sizeof **head);
将指向新的内存块,而不必为新的内存返回并分配起始地址。分配的内存块。让我知道这是否有助于清除。如果没有,我很乐意再试一次。