Скажем, я хочу динамически выделить массив, который может содержать любые данные, т.е. используя 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;
}
Это не первый раз, когда этот вопрос задают, но ответ обычно звучит так: «вы пытаетесь присвоить что-то функции, а не возвращаемое значение функции, что не разрешено». Справедливо, но можно ли обойти это? Я немного запутался!!
errno
, которая является потокобезопасной из-за использованияerrno
, являющегося макросом, который использует функцию, которая возвращает указатель int на памятьerrno
конкретного потока. - person Richard Chambers   schedule 26.06.2014