2015-08-17 6 views
-1

Есть ли способ определить переменную размерную переменную в C?Как определить переменную переменную в C

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

Чтобы динамически определить записи таблицы, мы можем использовать malloc в C или new на C++, но как размер? Я имею в виду что-то вроде ниже

typedef union { 
    // the size of x is determined by the configuration file 
    typeof(x) x; 
    struct { 
    // n, m are read from the configuration file when the program is running 
    typeof(x1) x1: n; 
    typeof(x2) x2: m; 
    // Also, the fields should be variadic 
    ... //other_variable 
    }; 
}; 

Большое спасибо, и идея, пожалуйста, ответьте мне, даже если вы думаете, я смешон.

+0

Динамически выделяется массив, возможно? –

+0

C и C++ для этого совершенно разные, поэтому вы должны решить, какой из них вы хотите. –

+0

Не так много вопросов о синтаксисе единорогов: -P ... –

ответ

1

C не управляет определением типа переменной. Вы должны управлять им самостоятельно с помощью указателей и распределения памяти, таких как malloc или new.

Это одна из причин, почему так много программ есть утечки памяти ...

unsigned int n,m; // n, m are read from the configuration file when the program is running 

struct x { 
    x1_t * x1; 
    x2_t * x2; 
    ... //other_variables 
}; 

int xread(struct x *decoded, const char *datap, int size) 
{ 
    malloc(x->x1, m); 
    if (!x->x1) 
     return -1; 
    malloc(x->x2, n); 
    if (!x->x2) { 
     free(x->x1); 
     return -1; 
    } 
    memcpy(x->x1, datap, m); 
    memcpy(x->x2, datap+m, n); 
    ... // other_variables 
    return m+n;//+... 
} 

int xwrite(char *bufferp, const struct x *decoded) 
{ 
    // bufferp shall be allocated with at least m+n 
    if (x->x1) { 
     memcpy(bufferp, x->x1, m); 
     bufferp += m; 
    } 
    if (x->x2) { 
     memcpy(bufferp, x->x2, n); 
     bufferp += n; 
    } 
    ... // other_variables 
} 
+0

Неправильно, для размера: C имеет VLA, массивы переменной длины. И тогда OP знает о 'malloc' и' new'. –

+0

Да, C имеет VLA для динамического управления размером таблицы. (Я исправил свой ответ.) Но вопрос был о записи таблицы, а не о размере таблицы. – Mike

Смежные вопросы