#include<stdio.h>
#include<stdlib.h>
void function(void *i, void *j);
struct mystruct {
int a;
int b;
} ;
int main()
{
int a = 50;
struct mystruct s ;
s.a = 100;
s.b = 200;
function(&a, &s);
}
void function(void *i, void *j)
{
printf("Integer is %d\n", *i);
printf("Struct member 1 is %d\n", j->a);
printf("Struct member 2 is %d\n", j->b);
}
Мой код выше. При компиляции я получаю следующие ошибки, и я понимаю, что мне нужно сделать, чтобы исправить их.void * использование для функции формальные аргументы
voidstartest.c: In function function:
voidstartest.c:27: warning: dereferencing void * pointer
voidstartest.c:27: error: invalid use of void expression
voidstartest.c:28: warning: dereferencing void * pointer
voidstartest.c:28: error: request for member a in something not a structure or union
voidstartest.c:29: warning: dereferencing void * pointer
voidstartest.c:29: error: request for member b in something not a structure or union
Вот что мне нужно сделать, чтобы исправить ошибки:
printf("Integer is %d\n", *(int*)i);
printf("Struct member 1 is %d\n", ((struct mystruct *)j)->a);
printf("Struct member 2 is %d\n", ((struct mystruct *)j)->b);
Вопросы:
Если я должен исправить ошибки так, как я описал выше, не что означает, что я должен знать тип указателей, которые я отправляю в функцию заранее? Я считаю это очень строгим требованием. Не так ли?
Некоторые библиотечные функции имеют формальный аргумент как void * также (например, qsort). Каким образом их реализация знает, каков правильный тип указателя, чтобы они могли разыменовать его для работы с фактическими данными (это указывает на)?
Да, я вижу, что qsort.c отбрасывает базу на char *, а затем использует размер одного элемента массива, а число элементов выполняет арифметику указателя, чтобы обратиться к другим элементам массива для выбора элементов для сравнения для реализации алгоритма , http://forums.devshed.com/c-programming-42/teacher-wants-source-code-of-qsort-function-233585.html – abc