我见过很多关于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
答案 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预处理器,请注意它有各种有趣的问题,所以在开始以宏的形式重写程序块之前先阅读它。
不知道你的程序是什么样的,我不知道这种方法对你有多可行,但宏预处理器通常可以帮助你假装你正在使用支持泛型编程的语言。