在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

如何调用该函数?您还需要一个间接级别您当然无法返回本地数组的地址。当函数返回时,该数据将无效。如何调用该函数?您需要更多级别的间接寻址您当然无法返回本地数组的地址。当函数返回时,该数据将无效。代码工作正常!但是,你能描述一下它的机制吗?代码工作正常!但是,你能描述一下它的机理吗?