структура calloc c - PullRequest
       15

структура calloc c

0 голосов
/ 09 марта 2009

C99 gcc

Я продолжаю получать эту ошибку. У меня есть структура вне основного. А внутри main я пытаюсь разместить в стеке, используя calloc. Кажется, я не могу понять, что не так.

Спасибо за любой совет,

ошибка: ожидаемое выражение перед символом ‘)’

/* global */
struct port_data_t                                                                      
{                                                                                       
    size_t task_id;                                                                     
    pthread_t *thread_id;                                                               
    size_t start_port;                                                                  
    size_t number_ports;                                                                
} *port_data;                                                                           


/* main function */
struct port_data_t *port_data = (struct task_data_t*) calloc(4, sizeof(port_data*));

Ответы [ 5 ]

8 голосов
/ 09 марта 2009

Должно быть calloc(4, sizeof(*port_data)): Примечание * перед е имя переменной.

4 голосов
/ 09 марта 2009

должно быть sizeof (port_data_t), а не sizeof (port_data *). Первый - это размер структуры port_data_t. Последнее ничего не значит.

1 голос
/ 09 марта 2009
#include <malloc.h>
#include <pthread.h>

typedef struct port_data_t {
    size_t task_id;
    pthread_t *thread_id;
    size_t start_port;
    size_t number_ports;
} port_data_t;

port_data_t* f() {
    port_data_t* ports = (port_data_t*)calloc(4, sizeof(port_data_t));
    return ports;
}
1 голос
/ 09 марта 2009

Попробуйте изменить это:

struct port_data_t *port_data = (struct task_data_t*) calloc(4, sizeof(port_data*));

К этому:

port_data = (struct port_data_t*) calloc(4, sizeof(*port_data));

Может работать немного лучше. Если вы объявили port_data глобальной структурой, вам не нужно повторно объявлять его как struct port_data_t. GCC должен уже знать это. Конечно, как бы я это сделал, это:

port_data = (struct port_data_t*) calloc(4, sizeof(struct port_data_t));

Но мне не нравится помещать переменные в sizeof(). Я стараюсь придерживаться там типов, просто по привычке. Кроме того, он разрешает любые неясности относительно того, как именно указатель должен быть разыменован, что в данном случае приводит вас в замешательство.

0 голосов
/ 09 марта 2009

Как отметил Jeffamaphone, task_data_t находится вне контекста. И также указано Crashworks, попробуйте sizeof (port_data_t), если вы хотите массив структур в port_data.

Использование sizeof (port_data *) позволит распределить указатель sizeof на указатель port_data_t, что в большинстве случаев полезно только в большинстве случаев.

...