【问题标题】:Dynamically create an array of TYPE in C在 C 中动态创建一个 TYPE 数组
【发布时间】:2011-06-18 19:41:21
【问题描述】:

我看过很多关于 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

【问题讨论】:

  • 我为问题的格式道歉;那里出了点问题。
  • 不需要强制转换 malloc,也不需要从/到 void* 的隐式转换。

标签: c arrays types dynamic


【解决方案1】:

您将很难在 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 预处理器,请注意它有各种有趣的陷阱,因此在着手将程序块重写为宏之前请先阅读它。

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

【讨论】:

    【解决方案2】:

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

    例如:

    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;
    

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

    【讨论】:

    • 无效*,完全忘记了。我认为这将解决我的问题。为所有回复的人干杯。
    • 不幸的是,这对我没有帮助。我的问题仍然在于变量的决策/范围。确实,我可以使用 void* 然后转换一个新数组。但是,我的程序如何知道要使用哪个数组?在声明“int *array1”或“float *array2”后,我需要我的程序使用该数组。在开关内声明 array1 和 array2 或者如果块将我的范围封装在那里。我需要的是:声明通用数组空间 -> 决定数据类型 - 使用适当数据类型的数组。
    • 我试图避免在文本上包含完全相同代码的 8 个不同块,除了每个块具有不同的数组类型。
    • @csand:这将是一个问题,因为无论右手值是什么,也取决于所使用的类型。就指针本身而言,您可以使用带有类型标志和不同指针类型联合的结构。
    • 我对联合不是很熟悉(目前正在阅读一些手册页),但你能解释一下你所说的类型标志是什么意思吗?
    猜你喜欢
    • 1970-01-01
    • 2020-07-25
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 1970-01-01
    相关资源
    最近更新 更多