如何将uint8_t *作为缓冲区传递给函数

时间:2015-08-31 12:14:45

标签: c

我是C初学者。我在C中实现了一些代码,它将调用接口函数,参数uint8_t *value 传递缓冲区int32_t *length 传递缓冲区长度

/*interface function declaration in header file
 * this interface implementation is not under my
 * control. I just call the following function.
 * The return value is 0(successful) or 1(fail)
 */
int get_parameter(uint8_t *value, uint32_t *length);

/*My .c File */
/*can it be passed as buffer? because the function will
 *assign some memory located value to this parameter.
 *uint8_t cant have value greater than 255 but in my
 *case the memory located value can be larger than 255
 */
uint8_t value; 

/*Is it correct ? 
 *This should be the length of the buffer declared above*/
uint32_t length = sizeof(value);

/* interface function call in my code */
int result = get_parameter(&value, &length);

if(result == 0)
{
   char *data;
   int32_t *myValue; /*want to assign what value parameter pointing to*/
   memcpy(data + sizeof(int32_t), &value, length); /*perhaps something like this ?*/

}

值和长度是输入/输出参数。此接口函数会将值< > 255赋值给value参数,并将值的字节长度分配给长度参数。

我的问题是,如何调用接口函数int get_parameter(uint8_t *value, uint32_t *length),以便它可以为值参数赋值,而不管大小如何。我对值参数有点困惑,因为uint8_t只能有最大值255但在我的情况下它可能大于255.我期待解决方案是这样的。

char *value; 
uint32_t length = sizeof(value);

/* interface function call in my code */
int result = get_parameter(value, &length);

if(result == 0)
{
   uint32_t *myValue;
   *myValue = atoi(value);
   printf("%d", *myValue); /*it should print whatever the value assigned by the get_parameter function*/
}

1 个答案:

答案 0 :(得分:1)

假设get_parameterint32_t指向的内存中返回value,这是一种方法:

int32_t value;
uint32_t length = sizeof(value);

if(get_parameter((uint8_t *)&value, &length) == 0)
{
    // value is an int32_t containing data set by get_parameter()
}

三条评论:

  1. 使用&(和号)字符前置参数意味着获取参数的地址,这只是另一种说法"指向"参数。

  2. 根据(uint8_t *)的要求,&value会将uint8_t *的类型转换为get_parameter。 Typecasts有时是不受欢迎的,但很难避免;替代解决方案可以基于将uint8_t数组传递给get_parameter,然后使用memcpy将值复制回int32_t,但即便如此,您也可以在memcpy调用中需要一些(隐式)强制转换。另请注意,从int32_t *uint_8 *的转换通常有效,从uint8_t *转换为int32_t *(或从任何较小类型转换为较大类型)可能会导致某些体系结构出现对齐问题

  3. 最后,length是一个指针,这意味着get_parameter可能会返回实际写入*value的字节数。如果是这种情况,那么为了正确起见,您应该在调用length后检查get_parameter是否包含预期内容,即检查length == sizeof(value)

    < / LI>