-1

我想知道返回指向本地静态/全局变量的指针的函数是否可以像 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 中是否有任何有趣的用途。任何真正的应用程序也会很好。

4

2 回答 2

5

我想知道函数是否可以像在 C++ 中一样在 C 中用作左值,所以我尝试了一下,似乎这是可能的。

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

malloc = some_other_function;

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

void *(*malloc_wrapper)(size_t);

malloc_wrapper = malloc;

int *arr = malloc_wrapper(10 * sizeof(*arr));
于 2013-01-30T15:34:57.903 回答
0

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

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

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

- 编辑 -

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

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

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

于 2013-01-30T21:24:19.233 回答