Динамически создать массив TYPE в C - PullRequest
1 голос
/ 31 января 2011

Я видел много сообщений для c ++ / java, но ничего не для C. Можно ли динамически выделять память для массива типа X во время выполнения? Например, в псевдо,

switch(data_type) 
     case1:float, create a new array of floats to use in the rest of the program
     case2:int, create new array of ints to use in the rest of the program
     case3:unsigned, ....
     // etc.

В моей программе я определяю тип данных из файла текстового заголовка во время выполнения, а затем мне нужно создать соответствующий массив для хранения / манипулирования данными. Есть ли какой-нибудь общий тип в C?

РЕДАКТИРОВАТЬ: мне нужно динамически создать и решить, какой массив должен быть создан.

Спасибо, csand

Ответы [ 2 ]

5 голосов
/ 31 января 2011

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

Ex:

void * data_ptr = malloc( data_sz );

тогда вы можете назначить его указателю для любого типа, который вы хотите:

int *array1 = (int *)data_ptr;

или

float *array2 = (float *)data_ptr;

ПРИМЕЧАНИЕ: malloc выделяет память в куче, поэтому она не будет автоматически освобождена. Убедитесь, что вы освобождаете память, которую вы выделяете в какой-то момент.

UPDATE

enum {
    DATA_TYPE_INT,
    DATA_TYPE_FLOAT,
    ...
};

typedef struct {
    int data_type;
    union {
        float * float_ptr;
        int * int_ptr;
        ...
    } data_ptr;
} data;

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

0 голосов
/ 01 февраля 2011

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

Тем не менее, C поставляется с изящным и часто используемым препроцессором макросов, который позволяет вам (помимо прочего) определять новые функции, которые отличаются толькостатический тип.Например:

#define FOO_FUNCTION(t) t foo_function_##t(t a, t b) { return a + b; }

FOO_FUNCTION(int)
FOO_FUNCTION(float)

Это дает вам 2 функции, foo_function_int и foo_function_float, которые идентичны, кроме имени и сигнатуры типа.Если вы не знакомы с препроцессором Си, имейте в виду, что в нем есть много забавных ошибок, поэтому прочтите его, прежде чем приступать к переписыванию фрагментов вашей программы в виде макросов.

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

...