【问题标题】:How to convert an integer to a uint8_t pointer?如何将整数转换为 uint8_t 指针?
【发布时间】:2019-05-23 13:57:14
【问题描述】:

我有一个函数定义如下:

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

但它不工作(给我分段错误错误)。知道我该怎么做吗?

【问题讨论】:

  • 你似乎在寻找的东西叫做compound literals。
  • 如果你只有 1 个值,为什么不直接用 printf 替换函数调用呢?
  • 我只是将我的案例简化为这个简单的 printf 案例来重现我的问题,但实际上这不是一个选择。 @Lundin
  • 确实,这正是我所需要的。谢谢! @some-programmer-dude

标签: c pointers formatting


【解决方案1】:
foo((uint8_t []) { 0x01 }, 1);

形式“( type ) { initializers...}”是一个复合文字,在 C 2018 6.5 中指定.2.5.它使用初始化器给定的值创建指定类型的对象。

(uint8_t []) { 0x01 } 创建一个包含一个uint8_t 的数组,其值为0x01。作为一个数组,它会自动转换为指向它的第一个元素的指针,适合foo的第一个参数。

函数内的复合文字是临时的,自动存储持续时间与其封闭块相关联。函数外的复合字面量在程序的执行过程中持续存在,具有静态存储持续时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多