我有一个定义如下的函数:
void foo(uint8_t *val, int num)
{
for(int i=0;i<num;i++)
printf("Buffer[%i]=0x%X \n",i,val[i]);
}
作为全局变量,我有一个声明为的数组:
uint8_t Buffer[4] = {0x01, 0x02, 0x03, 0x04};
因此,为了打印缓冲区,我执行以下操作:
int main()
{
foo(Buffer,4);
return 0;
}
哪个给出结果:
Buffer[0]=0x1
Buffer[1]=0x2
Buffer[2]=0x3
Buffer[3]=0x4
问题是,在特定情况下,我只需要向该函数发送一个uint8_t参数即可替换缓冲区,因此我将其实现为:
int main()
{
uint8_t READ_VAL[] = {0x01};
foo(READ_VAL,1);
return 0;
}
无论如何,有什么方法可以内联吗?我尝试这样做
foo((uint8_t *)0x01,1);
,但它不起作用(给我“分段错误”错误)。知道我该怎么办吗?
答案 0 :(得分:2)
foo((uint8_t []) { 0x01 }, 1);
形式“ (
类型 ) {
初始化器…}
”是复合文字 ,在C 2018 6.5.2.5中指定。它使用初始化程序给定的值创建指定类型的对象。
(uint8_t []) { 0x01 }
创建一个包含值uint8_t
的{{1}}的数组。作为数组,它会自动转换为指向其第一个元素的指针,该指针适合于0x01
的第一个参数。
函数内部的复合文字是临时的,其封闭模块具有自动存储时间。函数外部的复合文字可以持久地执行程序,并且具有静态存储期限。