在C中将空指针作为函数参数返回

时间:2018-09-10 12:21:30

标签: c pointers void

我有一个返回数组Data的函数。数组的类型为intfloat。我想使用void指针。如果outputType为0,则Data将指向整数数组的指针,否则将指向浮点数组。

是否可以在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);

2 个答案:

答案 0 :(得分:7)

您可以执行以下操作:

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

或:

float output[3];
getData(output, 1);

请特别注意不要超出数组的范围。


说明

任何指向对象类型的指针都可以转换为void*并再次返回原始类型,结果指针将与原始指针进行比较。

这可以(在这种情况下)用于实现可在任何指针类型上工作的通用函数(例如,What does void* mean and how to use it?)。

尽管有一个警告:void*不能被取消引用(也不能对其执行指针算法),因此必须在取消引用之前将其转换回原始指针类型。 outputType参数准确说明了原始指针的类型,因此该函数可以执行正确的转换。

之后,该函数可以对转换后的指针进行操作,就好像它是原始指针一样。如果原始指针指向一个数组,那么转换后的指针也可以用于访问该数组的所有项。

答案 1 :(得分:2)

完全有可能做您想做的事情,但不是完全按照您尝试做的方式做。如果您想在执行操作时预先分配缓冲区,那很好,您只需要传递指针本身即可。然后您的问题开始了。

首先,三个int16_t不足以容纳相同数量的float元素(通常每个元素4个字节)。您需要确保传入的缓冲区足够大以容纳输出。

第二,赋值Data = acc;仅复制指针的值,而不是其包含的数据。为此,您必须使用memcpy(Data, acc, 3 * sizeof(uint16_t));memmove(Data, acc, 3 * sizeof(uint16_t));或类似的方法。更简单地说,您可以将值直接存储在Data缓冲区中,而不必首先弄乱acc