#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