函数返回指向本地静态/全局变量的指针作为C中的左值

时间:2013-01-30 15:31:27

标签: c lvalue

我想知道返回指向本地静态/全局变量的指针的函数是否可以像C ++一样用作C语言中的左值,所以我尝试了它,看起来这是可能的。以下面的简单函数

为例

int* d(int a){
    static int* array = NULL;
    static int size = 0;
    if(a+1 > size){
        size = 2*(a+1);
        array = realloc(array, size * sizeof(int));
    }
    if(a == -1){
        free(array);
        return NULL;
    }
    return array + a;
}

这是一个简单的动态数组,你可以做例如*d(30) = 2,但由于每个编译单元只能有一个函数实例,所以我觉得这没有用。

我想问一下,如果这个概念在C中有任何有趣的用途。任何真正的应用都会很好。

2 个答案:

答案 0 :(得分:6)

  

我想知道函数是否可以在C ++中用作C值的左值,所以我尝试了它,看起来这是可能的。

不,你错了。在这里,您没有将该函数用作左值。您正在使用函数返回的指针指向的整数作为左值。如果您将该函数用作左值,则看起来像

malloc = some_other_function;

但是在C中,这是不可能的(你会遇到编译器错误)。但是,您可以创建可分配给的函数指针:

void *(*malloc_wrapper)(size_t);

malloc_wrapper = malloc;

int *arr = malloc_wrapper(10 * sizeof(*arr));

答案 1 :(得分:0)

由于realloc,这个例子很危险。您无法控制调用者使用指针执行的操作。考虑:

  *d(0)=0;
   int* insertPoint = d(1); //save for later
   *d(2)=2;  //forces realloc.
   *insertPoint = 1; //CRASH, points to freed memory.

我不认为动态数组是这种技术的一个很好的用例。

- 编辑 -

  

我想知道函数是否返回指向本地static / global的指针   变量可以用作左值......

他们可以,但正如你所指出的,每个编译单元只能有一个。所以它真的成为一个全局变量的包装器。或者使局部静态行为像全局一样的方法。因此,大多数用例只涉及使用非标准语法来执行标准操作。

我从未见过这种技术。我能想到的唯一可能的用途是提供某种单例构造。