C-将内存分配给指向结构中成员的指针

问题描述 投票:0回答:1

我已经看过很多其他问题,但是我仍然似乎无法弄清楚如何初始化指向同时也是指针的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;

有问题的行用换行分隔,其余未完成的代码在此处用于调用该函数,因此应忽略其功能。

感谢您对如何将指针分配给作为指针的成员的任何反馈。

c pointers dynamic-memory-allocation
1个回答
0
投票

无论何时声明类型pointer-to-pointer-to type,您都需要two分配,然后才能使用通过以下方式引用的任何pointer-to-pointer>]typepointer-to-pointer-to type(或至少分配一个指针,然后将现有对象分配给每个分配的指针)。

例如,您的声明:

sp_tuples_node **tuplepointer;

(假定std_tuples_node不是类型有效的指针)

您需要做的是:

  • 首先分配​​一定数量的指针。为什么?您有一个[[pointer-to-pointer。那是保存pointer-to 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

表示法将其引用为[C0 ]。

如果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,在取消引用后,您具有

  • pointer-to 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);将指向新的内存块,而不必为新的内存返回并分配起始地址。分配的内存块。让我知道这是否有助于清除。如果没有,我很乐意再试一次。
    © www.soinside.com 2019 - 2024. All rights reserved.