我想知道返回指向本地静态/全局变量的指针的函数是否可以像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中有任何有趣的用途。任何真正的应用都会很好。
答案 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的指针 变量可以用作左值......
他们可以,但正如你所指出的,每个编译单元只能有一个。所以它真的成为一个全局变量的包装器。或者使局部静态行为像全局一样的方法。因此,大多数用例只涉及使用非标准语法来执行标准操作。
我从未见过这种技术。我能想到的唯一可能的用途是提供某种单例构造。