c, присвоение значения, на которое указывает void * массиву void * - PullRequest
1 голос
/ 01 марта 2012

Я пытаюсь присвоить значение, на которое указывает void * в массиве void *.Вот что у меня есть:

23 void queue_enqueue(void *q, void *item) {
24 int len = 0 ;
25 
26 len = sizeof(q) ;
27 q[len-1] = 
28     item ;
29     
30 return ;
31 
32 }

С этой ошибкой компилятора:

myqueue.c:27: warning: dereferencing ‘void *’ pointer
myqueue.c:28: error: invalid use of void expression

Я искал ответ около часа, но пока не нашелвидел реализацию, аналогичную той, что мне дали здесь.Если вам интересно, да, это домашнее задание и прототип был предоставлен инструктором.

Поскольку они передаются как void * Я не смог использовать оператор gcc typeof.

Я в порядке с предупреждением.Я знаю, что просто gcc говорит мне, что «будьте осторожны, мы не собираемся проверять это для вас», но я не могу избавиться от ошибки в строке 28.

Спасибо за вашу помощь заранее,

Ответы [ 3 ]

3 голосов
/ 01 марта 2012

Это не массив void* s, это массив void (который на самом деле не существует), и разыменование дает вам void, который "не является реальным типом", поэтому вы не может присвоить ему.

Если вы пытаетесь работать с массивом void*, измените его на

void queue_enqueue(void** q, void* item)

или

void queue_enqueue(void* q[], void* item) // same as above

Также поймите, что ваша программа будет делать

q[sizeof(void**) - 1] = item;

каждый раз. sizeof дает размер типа указателя, а не массива. Вы должны передать длину массива в качестве отдельного аргумента, если вы хотите знать, какова длина массива.

1 голос
/ 01 марта 2012

Вам нужен массив void*:

void queue_enqueue(void *q[], void *item)
0 голосов
/ 01 марта 2012

void - это тип без размера. Таким образом, массив пустоты не может существовать. (потому что массив определяет количество единиц, а затем переходит с помощью оператора sizeof ().

вы должны были бы привести пустоту * к чему-то *, что-то, имеющее тот же размер, что вы на самом деле хранили там, так что, скажем, у вас есть тип T, который имеет тот же размер (я не говорю то же самое)

T* q2 = (T*)q;
T* item2 = (T*)item;
q2[len-1] = &item;

Это будет работать, потому что C передает указатели по ссылке.
поскольку T будет реальным типом, компилятор позволяет вам сделать это
так как размер T совпадает с вашими фактическими сохраненными значениями, вы получите правильное место хранения значений.

обратите внимание, что void * как массив будет содержать указатель на массив типа void. void * в качестве одного значения будет содержать одно значение void.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...