说我希望使用void**
作为我的类型,在C.然后,而不是每次都重新写入指针算术逻辑动态地分配一个数组,可以保存任何数据,即,我要简单的函数,返回一个元素的地址。为什么我不能在赋值中使用这个函数(即,我可以设置,以及获取元素的值)?使用函数返回指针作为左值
下面是一些示例代码:
#include <stdio.h>
#include <stdlib.h>
void printIntArray(void** array, size_t length) {
printf("Array at %p\n", array);
while (length--) {
printf(" [%zu] at %p -> %p", length, array + length, *(array + length));
if (*(array + length)) {
printf(" -> %d", *(int*)*(array + length));
}
printf("\n");
}
}
void* getElement(void** array, size_t index) {
return *(array + index);
}
int main(int argc, char** argv) {
const size_t n = 5;
size_t i;
/* n element array */
void** test = malloc(sizeof(void*) * n);
i = n;
while (i--) {
*(test + i) = NULL;
}
/* Set element [1] */
int testData = 123;
printf("testData at %p -> %d\n", &testData, testData);
*(test + 1) = (void*)&testData;
printIntArray(test, n);
/* Prints 123, as expected */
printf("Array[1] = %d\n", *(int*)getElement(test, 1));
/* Something new in [2] */
/* FIXME lvalue required as left operand of assignment */
int testThing = 456;
getElement(test, 2) = (void*)&testThing;
printIntArray(test, n);
return 0;
}
这不会是拳头时间这个问题已经被问,但得到的答复通常是沿着“您要的东西分配给一个函数中的行,而不是函数的返回值,这是不允许的“。够公平的,但可以解决这个问题吗?我有点困惑!
你为什么想这样做? – nightshade
@nightshade一个简单的例子,为什么你可能想要这样做是在这个stackoverflow的答案之一中提到[是errno线程安全](http://stackoverflow.com/questions/1694164/is-errno-thread-安全的),它有一个'errno'实现,由于使用'errno'是一个使用函数的线程安全的线程,该函数返回一个指向特定线程'errno'内存的int指针。 –
@nightshade就像一个练习,我正在编写一个动态数组库,并进行边界检查。上面的示例代码被简化以说明问题。 – Xophmeister