2009-03-09 6 views
0

C99 gccСтруктура calloc c

Я продолжаю получать эту ошибку. У меня есть структура вне основного. И внутри 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*)); 
+0

Любая причина, по которой вы используете другой тип, чем тот, который вы назначаете? –

+0

Я внес некоторые изменения. Должно быть: struct port_data_t * port_data = (struct port_data_t *) calloc (4, sizeof (port_data *)); – ant2009

+0

Я думаю, вам может потребоваться опубликовать весь код (если не слишком длинный) –

ответ

7

Должно быть calloc(4, sizeof(*port_data)): Примечание * befor e var name.

4

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

+0

Я предпочитаю использовать * <выделенный ptr>, меньше поломки, если тип изменяется. –

+0

Должно быть sizeof (struct port_data_t), а не sizeof (port_data_t), если я не ошибаюсь. –

+0

Плюсы! Убейте язычников! :) –

0

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

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

+0

Я предполагаю, что вы имели в виду 'sizeof (port_data_t *)' в конце ... –

+0

Нет, он имеет значение sizeof (struct port_data_t). Я проверил это с помощью GCC, и он не работает без ключевого слова struct. –

+0

Слишком много C++: '( –

1

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

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

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

1
#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; 
} 
Смежные вопросы