1

在 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) );

在传递的结构中为数组传递函数的正确方法是什么?

4

1 回答 1

1

当您说时uint16_t d[10];,您正在定义一个数组d。当您说 时d[0],您访问该数组的第一个元素,该元素的类型为uint16_t。该函数需要一个指针,因此您应该将指针转换为数组,而不是其中的元素:

fctn( (uint8_t*)d, 10*sizeof(uint16_t) );

当你这样做时,d从 type 衰减uint16_t[10]uint16_t*,然后uint8_t*在传递到 之前转换为fctn

顺便说一句,您还可以使用sizeof(d)来简化长度计算:

fctn( (uint8_t*)d, sizeof(d) );

请注意,这仅在d声明为数组(在堆栈上)时才有效。

于 2014-11-14T02:34:44.487 回答