struct c динамически распределяет память - PullRequest
2 голосов
/ 06 марта 2009

Я использую структуру и хочу инициализировать максимум 10 портов. Тем не менее, когда программа работает, она может быть намного меньше, мы не знаем до времени выполнения. Однако это будет максимум. Я никогда раньше не делал struct, подобную этой, поскольку обычно я динамически распределяю, используя 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] -> номер_порта = 20; printf ("номер_порта:% d \ n", порты [0] -> номер_порта);

#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;

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

Ответы [ 3 ]

7 голосов
/ 06 марта 2009

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

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;

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

6 голосов
/ 06 марта 2009
*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;
}
2 голосов
/ 06 марта 2009

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

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

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

...