首页 > 解决方案 > 使用指针在内存中迭代结构块

问题描述

再会,

    我正在尝试使用 malloc 函数创建结构的动态列表。对于每个结构块,我想设置结构字段,然后我想遍历每个内存。下面是我写的代码:-
#include <stdio.h>
#include <stdlib.h>

typedef struct
{
    int id;
    int portnum;
    int baudrate;
} port_t;

int main()
{

    port_t *port_pt = (port_t *)malloc(sizeof(port_t) * 2); //allocate two blocks

    port_pt->id = 1;
    port_pt->portnum = 9;
    port_pt->baudrate = 4800;

    printf("id : %i, port :COM%i baud : %i\n\n", port_pt->id, port_pt->portnum, port_pt->baudrate);

    port_pt++; //try make pointer point to next block
    port_pt->id = 2;
    port_pt->portnum = 9;
    port_pt->baudrate = 4800;
    port_pt--; //try to make pointer point to prev block

    int count = 0;
    while (port_pt != NULL)
    {
        printf("DEBUG id : %i, port :COM%i baud : %i\n", port_pt->id, port_pt->portnum, port_pt->baudrate);
        port_pt++;
    }

    return 0;
}

    但是,当我编译并运行此代码时。我得到这行输出而不是两行: -


调试输出

    谁能告诉我我哪里做错了?我真的很挣扎指针。

标签: cpointers

解决方案


你所写的是一个数组(正如 Sri 提到的那样使用不正确),而不是一个链表。

要创建一个链表,您需要将指向您的结构的指针添加到您的结构(<- 不是语法错误!),但正如您当前的代码那样,这是不可能的。您还必须更改声明:

typedef struct
{
    int id;
    int portnum;
    int baudrate;
} port_t;

至:

typedef struct port_t
{
    struct port_t *next;
    int id;
    int portnum;
    int baudrate;
} port_t;

struct tagputstag进入一个特殊的命名空间,该命名空间立即(甚至在开头之前{),并且这个命名空间只能通过struct(在 C 中访问。C++tag也放入父命名空间,所以上面给出一个重新声明错误,这就是为什么现代头文件倾向于使用typedef struct tag_s {...} tag_t;)。

从那里,您将使用 malloc 分配单个元素块,将每个新块指针分配给next前一个块中的字段,并将最终next字段设置为NULL(或 0)。当然,您会想要跟踪第一个块,并且还需要单独释放每个块。


推荐阅读