将char数组传递给const void * param

时间:2017-05-05 13:54:35

标签: c pointers casting

我有这样的结构:

typedef struct {
    float batch;
    float length;
    uint32_t test;
    char val[0];
}
PARAM;

我正在调用这种格式的函数:

void fillValues(float val, float len, uint32_t tmp, const void* prw);

我声明了结构并分配了一些内存:

PARAM *first = calloc(10, sizeof(PARAM));

我遇到的问题是如果我在调用函数之前打印first->data的值,它会按预期包含但是如果我调用函数:

fillValues (test, first->batch, first->length, first->test, &first->val);

并尝试在里面打印prw,它什么都没有。

我认为我传递的值不正确,因为它被声明为char数组,但函数参数是一个const void *。 附:我不想改变fucntion param类型。

在fillValues中使用prw的唯一部分是转换为double:

double *value
value = (double*)first->data;
*value = *(const double*)pwr;

1 个答案:

答案 0 :(得分:3)

char val[0];是无意义的,这是无效的C.数组的大小不能为零。 GCC编译器有一个允许这种情况的非标准语言扩展(作为20世纪90年代对旧"struct hack"的修复)。当灵活的阵列成员添加到语言中时,这一切在1999年已经过时了,采用了C99标准。

将您的结构更改为:

typedef struct {
    float batch;
    float length;
    uint32_t test;
    char val []; // flexible array member
}
PARAM;

然后将内存分配为

PARAM* p = malloc(sizeof(PARAM) + sizeof(n));

其中n是您希望数组char val[]拥有的长度。

由于您的函数的格式为const void* prw,因此调用中的最后一个参数应为first->val而不是&first->val

这是为什么在可能的情况下应该避免使用void指针的一个完美示例:它们倾向于隐藏错误并阻止编译器警告。