我有这样的结构:
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;
答案 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指针的一个完美示例:它们倾向于隐藏错误并阻止编译器警告。