将uint16_t数组传递给需要uint8_t *的函数

时间:2014-11-14 02:29:33

标签: c arrays uint8t

在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中为数组执行函数传递的正确方法是什么?

1 个答案:

答案 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被声明为数组(在堆栈上)时才有效。