编译器告诉你return &buffer;
返回一个指向 7 数组的指针uint8_t
(拼写为uint8_t (*)[7]
),但你说函数返回uint8_t *
,这些是不同且不兼容的指针类型。
如果您编写了return buffer;
,则类型将是正确的,但代码仍然是错误的。您不能安全地返回指向堆栈上的本地数组的指针。
要么制作它static const uint8_t buffer[] = { … };
并将函数返回类型更改为const uint8_t *
,然后相应地使用(这是线程安全的,因为数据永远不会改变):
const uint8_t *createTestBuffer(void)
{
static const uint8_t buffer[] = { 5, 7, 3, 4, 9, 1, 3 };
return buffer;
}
或者以某种形式使用动态分配:
uint8_t *createTestBuffer(void)
{
static const uint8_t buffer[] = { 5, 7, 3, 4, 9, 1, 3 };
uint8_t *rv = malloc(sizeof(buffer));
if (rv != 0)
memmove(rv, buffer, sizeof(buffer));
return rv;
}
请注意,这里的调用代码需要检查它是否再次返回一个非空指针,并且它还必须确保它调用free()
返回的指针,除非它为空(当调用free()
变为可选时)。
或者让调用者传递缓冲区——假设用户知道传递足够的空间,从而过着危险的生活:
void createTestBuffer(uint8_t *output)
{
static const uint8_t buffer[] = { 5, 7, 3, 4, 9, 1, 3 };
memmove(output, buffer, sizeof(buffer));
}
或者生活不那么危险:
static inline size_t min(size_t a, size_t b) { return (a < b) ? a : b; }
void createTestBuffer(uint8_t *output, size_t outlen)
{
static const uint8_t buffer[] = { 5, 7, 3, 4, 9, 1, 3 };
memmove(output, buffer, min(sizeof(buffer), outlen));
}
还有其他方法可以处理“输出缓冲区小于复制缓冲区”;此代码尽可能安全地复制,但您可以返回 0 或 1 状态指示截断,或断言提供的长度不小于所需长度,或者……</p>