gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:10:35 25 4
gpt4 key购买 nike

我已经看到了很多其他问题,但是我似乎仍然无法弄清楚如何初始化指向也是指针的结构成员的指针。鉴于我指向我的结构的指针(其中包含一个作为指针的成员),我想初始化一个指向该成员指针的指针。

例如,将节点添加到链表时,我学习的示例中给出的参数是 addNode(**head, etc)。我想知道我是否需要为这个指针分配内存,以及如果我在下面的代码中做错了如何初始化它。

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;

有问题的行由新行分隔,其余未完成的代码用于调用函数的上下文,应忽略其功能。

感谢您提供有关如何将指针分配给指针成员的任何反馈。

最佳答案

每当你声明一个指向指针的类型 type您需要两次分配才能使用任何指向 type 的指针通过指向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 之一的每个 block 分配起始地址您已分配并分配给 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);
    }
    }

    ( 注意: 如果你总是使用取消引用的指针来设置你分配的类型的类型——你永远不会弄错你的类型)

    现在您已经为 50 分配了存储空间。指针并将起始地址分配给 tuplepointer .您还为 50 - sp_tuples_node 分配了存储空间并且您已将每个的起始地址分配给 50 之一分配给 tuplepointer 的 block 中的指针.您可以引用每个 sp_tuples_node使用数组索引符号作为 tuplepointer[i] .

    如果 sp_tuples_node包含另一个指向某种类型的指针作为结构的成员,您现在可以分配一个存储 block 并将起始地址分配给该指针。假设你有 char *str;作为 sp_tuples_node 的成员.然后您可以分配:
    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);

    依此类推……您可以根据需要多次执行此操作。您唯一需要保持直截了当的是您是分配指针还是为对象分配存储空间。显然用指针指向 type当您取消引用一次并需要为指向 type 的指针分配时,您正在分配指针您正在为一个对象分配存储空间。

    你怎么保持直?

    这样想吧。当你取消引用你要分配的类型时——你有什么?
  • 带有指向type的指针,当取消引用时,您有指向 type 的指针(您正在分配指针)
  • 带有指向 type 的指针, 取消引用时,您有 type (您正在分配一个对象)

  • 最后,您在问题中提到了链表,并提到了 addNode(**head, etc) .那是不同的。在这种情况下,您可能在调用者中有(例如 main() )
    node *head;

    然后你调用:
    addNode (&head, etc);

    那里的参数类型是指针到指针 head因为您将原始指针的地址传回 main() . head本身已经有一个有效的地址,所以你不要分配给 head本身。

    你通过 &head所以函数 addNode接收原始指针的地址而不是指针的副本。这样,如果您需要为通过 head 引用的节点分配存储空间你可以分配 *head = malloc (sizeof **head);并在函数返回 head将指向 addNode() 中分配的新内存块无需返回并分配新分配的内存块的起始地址。

    让我知道这是否有助于清除它。如果没有,我很乐意再试一次。

    关于C - 将内存分配给指向结构中成员的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58849274/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com