我是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*/
}
答案 0 :(得分:1)
假设get_parameter
在int32_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()
}
三条评论:
使用&
(和号)字符前置参数意味着获取参数的地址,这只是另一种说法"指向"参数。
根据(uint8_t *)
的要求,&value
会将uint8_t *
的类型转换为get_parameter
。 Typecasts有时是不受欢迎的,但很难避免;替代解决方案可以基于将uint8_t
数组传递给get_parameter
,然后使用memcpy
将值复制回int32_t
,但即便如此,您也可以在memcpy
调用中需要一些(隐式)强制转换。另请注意,从int32_t *
到uint_8 *
的转换通常有效,从uint8_t *
转换为int32_t *
(或从任何较小类型转换为较大类型)可能会导致某些体系结构出现对齐问题
最后,length
是一个指针,这意味着get_parameter
可能会返回实际写入*value
的字节数。如果是这种情况,那么为了正确起见,您应该在调用length
后检查get_parameter
是否包含预期内容,即检查length == sizeof(value)
。