Итерировать блоки структуры в памяти, используя указатель - PullRequest
0 голосов
/ 20 февраля 2020

Добрый день,

Я пытаюсь создать динамический c список структур с помощью функции mallo c. Для каждого блока структуры я хочу установить поля структуры, а затем я бы хотел l oop через каждую память. Ниже приведен код, который я написал: -
#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;
}

Однако, когда я компилирую и запускаю этот код. Я получаю вывод этой строки вместо двух строк: -


debug output

Может кто-нибудь показать мне, где я ошибся? Я действительно борюсь с указателями.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2020

То, что вы написали, - это массив (с неправильным использованием, упомянутым Шри), а не связанный список.

Чтобы создать связанный список, вам нужно добавить указатель на вашу структуру в вашу структуру ( <- не грамматическая ошибка!), но, как показывает ваш код, это невозможно. Вы также должны изменить объявление: </p>

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 tag помещает tag в специальное пространство имен, которое находится непосредственно (даже перед открытием * 1011) *), и это пространство имен доступно только через struct (в C. C ++ помещает tag также в родительское пространство имен, поэтому вышеприведенный выдаст ошибку переопределения, поэтому современные заголовки как правило, используют typedef struct tag_s {...} tag_t;).

Оттуда вы будете распределять блоки по одному элементу, используя mallo c, назначая каждый новый указатель блока в поле next в предыдущем блоке и устанавливая последний next поле до NULL (или 0). Конечно, вы захотите отследить первый блок, и вам также потребуется освободить каждый блок отдельно.

0 голосов
/ 20 февраля 2020
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++;
    }

изменить это на

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

Потому что, при увеличении port_pt не приходит к NULL и не забудьте освободить () память, выделенную mallo c ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...