在C中动态创建TYPE数组

时间:2011-01-31 19:40:23

标签: c arrays types dynamic

我见过很多关于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 个答案:

答案 0 :(得分:5)

假设您计算数组所需的总大小(以字节为单位),您可以只分配那么多内存并将其分配给正确的指针类型。

例如:

void * data_ptr = malloc( data_sz );

然后你可以将它分配给你想要的任何类型的指针:

int *array1 = (int *)data_ptr;

float *array2 = (float *)data_ptr;

注意:malloc在堆上分配内存,因此不会自动释放它。确保释放您在某个时刻分配的内存。

<强>更新

enum {
    DATA_TYPE_INT,
    DATA_TYPE_FLOAT,
    ...
};

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

虽然这可能允许您存储指针并告诉您应该使用哪种类型的指针,但仍然存在根据数据类型不必分支行为的问题。这将很困难,因为编译器必须知道分配的数据类型等。

答案 1 :(得分:0)

您将很难在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,它们与名称和类型签名不同。如果你不熟悉C预处理器,请注意它有各种有趣的问题,所以在开始以宏的形式重写程序块之前先阅读它。

不知道你的程序是什么样的,我不知道这种方法对你有多可行,但宏预处理器通常可以帮助你假装你正在使用支持泛型编程的语言。