2016-01-26 6 views
-2

Ну, у них есть проблема, инициализирующая структуры глобального определенного типа.C Инициализация заданных указателей структуры структуры

typedefined является:

typedef struct { 
    pthread_t pthread; 
    int status; 
    int id; 
    time_t entrada; 
} Cliente; 

И глобальная декларация им с помощью это:

Cliente *cola=malloc(sizeof(Cliente)); 

но компилятор говорит, что это должно быть определено одним CONSTANT

Цель СССР является иметь динамический массив типа Cliente с именем cola. Если я не инициализирую их хорошо, я получаю ошибку сегментации в 0.00s исполнения. Причина того, что это глобальная переменная, потому что это ресурс, общий для потоков, я знаю, что это не лучшая практика, но я должен действовать так.

Я не знаю, сколько у меня было бы Cliente (может быть номер по умолчанию или один случайный ввод argv), поэтому я применил и указатель структуры.

Заранее спасибо :)

+3

Поскольку инициализатор не является постоянным выражением, вы должны выполнить инициализацию внутри функции. –

+0

Tom Karzes, но как инициализировать указатель структуры массива, если я точно не знаю, сколько членов мне нужно в нем? –

+0

Ну в вашем примере кода вы пытаетесь выделить место для одного. Вы можете, конечно, сделать то же самое изнутри функции. Но если на самом деле вы хотите сделать что-то отличное от того, что находится в вашем примере, просто подождите, пока вы не узнаете, сколько вы хотите, а затем выделите его как массив. Если это значение изменяется, вы можете использовать 'realloc' для увеличения размера массива. –

ответ

2

Определить его на глобальном масштабе и выделить память, что перед первым использованием. Например:

Cliente* cola; 

int main(int argc, char** argv) 
{ 
    if (argc < 2) { 
     perror("First arg indicates thread numbers and is required"); 
    } 

    int thread_count = atoi(argv[1]); 
    cola = malloc(sizeof(*cola) * thread_count); 
    ... 
    // Extend cola size without losing previous data 
    cola = realloc(cola, sizeof(*cola) * (thread_count + x)); 
} 
Смежные вопросы