在C中作为函数参数返回空指针
我有一个函数,它返回一个数组在C中作为函数参数返回空指针,c,pointers,void,C,Pointers,Void,我有一个函数,它返回一个数组数据。数组的类型为int或float。我想使用void指针。如果outputType为0,则数据将指向整数数组的指针,否则将指向浮点数组 是否可以在C中执行此操作 void getData(void *Data , uint8_t outputType) { ... int16_t acc[3]={0,0,0}; ... acc[0] = (int16_t) ((data[1]*256+data[0])); acc[1]
数据
。数组的类型为int
或float
。我想使用void
指针。如果outputType
为0,则数据将指向整数数组的指针,否则将指向浮点数组
是否可以在C中执行此操作
void getData(void *Data , uint8_t outputType)
{
...
int16_t acc[3]={0,0,0};
...
acc[0] = (int16_t) ((data[1]*256+data[0]));
acc[1] = (int16_t) ((data[3]*256+data[2]));
acc[2] = (int16_t) ((data[5]*256+data[4]));
Data = acc;
}
在主代码中:
int16_t output[3];
getData(output, 0);
您可以这样做:
void getData(void *Data , uint8_t outputType) {
if (outputType == 0) {
int16_t* data = Data;
/* fill int16_t data here - eg. : */
data[0] = 42;
}
else {
float* data = Data;
/* fill float data here - eg. : */
data[0] = 42.0f;
}
}
假设您将其称为:
int16_t output[3];
getData(output, 0);
或:
请特别注意不要超出数组的边界
解释
任何指向对象类型的指针都可以转换为a,然后再转换回原始类型,所得指针将与原始指针进行比较
这可以用来(在本例中)实现可以在任何指针类型上工作的通用函数(参考例)
不过有一个警告:不能取消引用void*
(也不能对其执行指针运算),因此必须在取消引用之前将其转换回原始指针类型。outputType
参数准确地说明了原始指针类型,因此函数可以执行正确的转换
之后,函数可以像处理原始指针一样处理转换后的指针。如果原始指针指向数组,则转换后的指针也可用于访问该数组的所有项。您可以执行以下操作:
void getData(void *Data , uint8_t outputType) {
if (outputType == 0) {
int16_t* data = Data;
/* fill int16_t data here - eg. : */
data[0] = 42;
}
else {
float* data = Data;
/* fill float data here - eg. : */
data[0] = 42.0f;
}
}
假设您将其称为:
int16_t output[3];
getData(output, 0);
或:
请特别注意不要超出数组的边界
解释
任何指向对象类型的指针都可以转换为a,然后再转换回原始类型,所得指针将与原始指针进行比较
这可以用来(在本例中)实现可以在任何指针类型上工作的通用函数(参考例)
不过有一个警告:不能取消引用void*
(也不能对其执行指针运算),因此必须在取消引用之前将其转换回原始指针类型。outputType
参数准确地说明了原始指针类型,因此函数可以执行正确的转换
之后,函数可以像处理原始指针一样处理转换后的指针。如果原始指针指向一个数组,则转换后的指针也可用于访问该数组的所有项。完全可以执行您想要执行的操作,但不能完全按照您尝试的方式执行。如果您想像现在这样预分配缓冲区,那很好,您只需要传入指针本身。然后你的问题就开始了
首先,三个int16\t
不足以容纳相同数量的float
元素(通常每个元素有4个字节)。您需要确保传入的缓冲区足够大以容纳输出
其次,分配Data=acc代码>只复制指针的值,而不是它包含的数据。为此,您必须使用memcpy(Data,acc,3*sizeof(uint16_t))代码>,memmove(数据,acc,3*sizeof(uint16_t))代码>,或类似的东西。更简单地说,您可以直接将值存储在数据
缓冲区中,而不必首先处理acc
。可以做您想做的事情,但不完全是您尝试的方式。如果您想像现在这样预分配缓冲区,那很好,您只需要传入指针本身。然后你的问题就开始了
首先,三个int16\t
不足以容纳相同数量的float
元素(通常每个元素有4个字节)。您需要确保传入的缓冲区足够大以容纳输出
其次,赋值Data=acc代码>只复制指针的值,而不是它包含的数据。为此,您必须使用memcpy(Data,acc,3*sizeof(uint16_t))代码>,memmove(数据,acc,3*sizeof(uint16_t))代码>,或类似的东西。更简单地说,您可以直接将值存储在数据
缓冲区中,而不必首先处理acc
。如何调用该函数?您还需要一个间接级别您当然无法返回本地数组的地址。当函数返回时,该数据将无效。如何调用该函数?您需要更多级别的间接寻址您当然无法返回本地数组的地址。当函数返回时,该数据将无效。代码工作正常!但是,你能描述一下它的机制吗?代码工作正常!但是,你能描述一下它的机理吗?