c - 请求一个简单的 C 代码示例,展示如何使用通用或无类型(通过 void *)数组

标签 c data-structures

我正在努力用 C 语言创建一个通用(或非类型化)数组(我知道 C++ 使这更容易)。简而言之,我想分配一个数组来保存特定已知类型的数组(在运行时)。在实际实现中,它取决于用户输入。

我一直在尝试使用枚举/结构场景,遵循在几个谷歌命中中找到的建议,但我担心我对 void 指针缺乏经验并且缺乏具体示例阻止我获得一段有效的代码. (通常我只会买一本书,但我在一个我不会说该语言的国家,而且英语编程书籍不存在。)

问题归结为以下简化:我有一个图像(只有一维),像素值可能是 int、float 或 double。我确实有一个函数可以告诉我类型。我想要做的就是将像素存储在适当类型的数组中。 (实际上这些图像非常大,我的动机是节省内存并避免为每种类型编写代码块。)

我一直在尝试类似下面的方法,但它可能不是最好的(可能的数据结构的代码片段):

enum type {
    typeint, typefloat, typedouble
};

struct genericarray {
    enum type type;
    void *storage;
};

我想以某种方式将这些像素存储在 generciarray 的实例中。到目前为止,我所有的尝试都变成了“警告:取消引用‘void *’指针”派对,我承认我不理解。

我永远感激任何帮助,特别是一些简化的例子,如何获得一个有效的通用数组。该示例可以只使用 for 循环来初始化。我可以弄清楚如何加载我的实际图像。

最佳答案

我会将整个事情封装如下:

#include "stdlib.h"
#include "stdio.h"

// structure
enum type { typeint, typefloat, typedouble };

struct genericarray
{
    enum type type;
    void ** storage;
};

typedef struct genericarray genericarray;

// allocate
void allocate(long numItems, enum type varType, genericarray * array)
{
    (*array).type = varType;
    switch (varType)
    {
        case typeint:
            (*array).storage = malloc(numItems*sizeof(int));
            break;
        case typefloat:
            (*array).storage = malloc(numItems*sizeof(float));
            break;
        case typedouble:
            (*array).storage = malloc(numItems*sizeof(double));
    }
}

// release
void release(genericarray array)
{
    free(array.storage);
}

// usage
int main(int argCount, char ** argList)
{
    genericarray image_1;
    genericarray image_2;

    int iv;
    float fv;

    allocate(10, typeint, &image_1);
    allocate(10, typefloat, &image_2);

    ((int *)(image_1.storage))[5] = 42;
    iv = ((int *)(image_1.storage))[5];
    printf("image_1[5] = %d\n", iv);

    ((float *)(image_2.storage))[5] = 3.14159;
    fv = ((float *)(image_2.storage))[5];
    printf("image_2[5] = %f\n", fv);

    release(image_2);
    release(image_1);

    return 0;
}

关于c - 请求一个简单的 C 代码示例,展示如何使用通用或无类型(通过 void *)数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/631632/

相关文章:

c++ - 将结构放入匿名命名空间有什么作用?

c++ - 通过引用传递无效时通过传递链表在第 n 个位置添加元素

c++ - 访问 range_expression 内的嵌套元素返回不完整的映射(段错误)

c - 提取最小元素后的最小堆问题

algorithm - 索引结构(分层帕特里夏特里)

c - 像 snmpget 这样的 c 应用程序采用什么参数?

c - NSURLConnection 失败,错误代码为 -1001

c - 不推荐基于堆栈的分配?

c - 使用 getchar 时出现段错误

c++ - 为什么我的(重新)实现 strlen 是错误的?