在C中,我想将一个uint16_t数组传递给一个带uint8_t的函数:
bool fctn(uint8_t *data, size_t length);
我有这个数组,它位于结构体中:
typedef struct sStruct sStruct;
struct sStruct{
uint16_t d[10];
}
sStruct myStruct;
所以我这样做:
void test(sStruct structData) {
fctn( (uint8_t*)structData->d[0], 10*sizeof(uint16_t) );
}
这里的长度不是问题,它正在传递数组。如果这个数组不是指针 我得到“错误:从不同大小的整数转换为指针”,我怎么能让它看起来像uint8_t的数组?就该函数而言,uint16_t数组看起来就像是一个大小为uint8_t的双长度数组,但我不知道如何告诉编译器......当输入已经是指针时。
如果数组'd'不在结构中,但只是说是全局的,我只会做
fctn( (uint8_t*)d, 10*sizeof(uint16_t) );
在传递的struct中为数组执行函数传递的正确方法是什么?
答案 0 :(得分:1)
当您说uint16_t d[10];
时,您正在定义数组d
。当您说d[0]
时,您将访问该数组的第一个元素,即uint16_t
类型。该函数需要一个指针,因此您应该转换指向数组的指针,而不是其中的元素:
fctn( (uint8_t*)d, 10*sizeof(uint16_t) );
执行此操作时,d
会从uint16_t[10]
类型变为uint16_t*
,然后转移到uint8_t*
,然后传递给fctn
。
另外,您还可以使用sizeof(d)
来简化长度计算:
fctn( (uint8_t*)d, sizeof(d) );
请注意,这只有在d
被声明为数组(在堆栈上)时才有效。