структура c динамически выделяет память

StackOverflow https://stackoverflow.com/questions/619858

  •  03-07-2019
  •  | 
  •  

Вопрос

Я использую структуру, и я хочу инициализировать максимум 10 портов.Однако, когда программа запущена, это может быть намного меньше, мы не узнаем до времени выполнения.Однако это будет максимум.Я никогда раньше не делал подобную структуру, так как обычно я динамически выделяю, используя calloc и delcare, такие как this *ports в качестве типа значения.

Однако я не могу этого понять

*ports[MAX_PORTS]. Am I creating 10 pointers that point to port objects?

И

*ports = (struct port_t*) calloc(2, sizeof(*ports)); 

Похоже, я выделяю один указатель, который указывает на 2 объекта порта, выделенных в бесплатном хранилище?

Я не могу понять, почему я использую оператор точки с оператором стрелки?порты[0]-> port_id = 20;printf("идентификатор порта:%d ", порты[0]-> port_id);

#include <stdio.h>
#include <stdlib.h>

#define MAX_PORTS 10

struct port_t
{
    int port_id;
    char name;
} *ports[MAX_PORTS];

int main(void)
{
    *ports = (struct port_t*) calloc(2, sizeof(*ports));

    ports[0]->port_id = 20;

    printf("port_id: %d\n", ports[0]->port_id);

    return 0;
}

обычно то, что я делал в прошлом, заключается в следующем:

struct port_t
{
    int port_id;
    char name;
} *ports;

ports = (struct port_t*) calloc(2, sizeof(*ports));

А затем назначьте любое из приведенных ниже действий.Однако предыдущий программист объявил все так, как я показал вверху, так что я ничего не могу изменить.

ports[0].port_id = 10;
ports->port_id = 10;

Большое спасибо за любые предложения,

Это было полезно?

Решение

*ports[MAX_PORTS]. Am I creating 10 pointers that point to port objects?

Да, вы создаете массив из десяти указателей

*ports = (struct port_t*) calloc(2, sizeof(*ports));

...но эта реплика - бессмыслица.Это то же самое, что и это:

ports[0] = (struct port_t*) calloc(2, sizeof(port_t));

т.е.Вы устанавливаете первый указатель так, чтобы он указывал на достаточное количество памяти для двух портов.

Для такой мелочи было бы гораздо разумнее создать десять портов, но не использовать их все:

#define MAX_PORTS 10

struct port_t
{
    int port_id;
    char name;
} ports[MAX_PORTS];

/* number of ports in use */
int numPorts = 0;

int main(void)
{
    numPorts = 3;
    for (int i=0; i<numPorts; i++) {
     ports[i].port_id = i;
     printf("port_id %d: %d\n", i, ports[i].port_id);
    }
    return 0;
}

Другие советы

Ваш первый блок кода имеет

struct port_t
{
    int port_id;
    char name;
} *ports[MAX_PORTS];

который представляет собой массив указателей. Это значит позже, когда вы используете

ports[0]->port_id

вы разыменовываете первый указатель в массиве. Есть также некоторое уродство, окружающее размер того, что вы на самом деле называете. Вы на самом деле заменяете свой массив из 10 на массив из 2. То, что у вас есть, обычно ужасно и подвержено ошибкам.

Я полагаю, что ваши намерения более соответствуют принципам:

struct port_t
{
    int port_id;
    char name;
} *ports;

int main(void)
{
    *ports = (struct port_t*) calloc(2, sizeof(*ports));

    ports[0].port_id = 20;

    printf("port_id: %d\n", ports[0].port_id);

    return 0;
}

Поскольку вы используете C99, вы можете избежать calloc () / malloc (), если вы действительно хотите , используя объявление массива переменных C99.

port_t array_on_mains_stack[some_runtime_port_count];
ports = array_on_mains_stack;

Хитрость заключается в том, что поскольку он находится в стеке, он действителен только для этой функции и любой вызываемой ею функции. Когда вы вернетесь из этой функции, она, конечно, будет освобождена.

ports - это массив указателей на объекты port_t, поэтому, делая port [0], вы получаете указатель, а не объект, и вам нужно получить к нему доступ - >

Возьмите хороший ресурс по указателям на C и прочитайте его от корки до корки. Есть также учебники по чтению объявлений на языке Си. Вы не сможете понять эту тему, получив ответы на случайные вопросы.

Вот ссылка , которую стоит прочитать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top