2014-12-03 67 views
0

我有一個名爲的I定義自己如下一個結構內部的結構統計變量:訪問結構成員變量傳遞到功能

struct myStruct { 
    struct stat s; 
}; 

,我想找到兩個MYSTRUCT對象之間的ST_MODE之間的區別,所以我的邏輯是指向該結構並使用'。'爲其成員變量。

int func(const void *a, const void *b) 
{ 
    return a->s.st_mode - b->s.st_mode; 
} 

不過,也有與此實施問題:

error: request for member 's' in something not a structure or union 
warning: dereferencing 'void *' pointer [enabled by default] 

我該怎麼做來糾正呢?

回答

2

你的函數的參數是struct myStruct*類型的const void*類型不是。

你肯定知道他們實際上是指向struct myStruct S'如果是這樣,你可以做一個投:

return ((struct myStruct*)a)->s.st_mode - ((struct myStruct*)b)->s.st_mode 

,但它的安全重新定義你的函數只接受正確類型的指針這樣的:

int func(const struct myStruct* a, const struct myStruct* b) 

,然後保持休息不變。

+0

我有使用常量無效*實現它,而我只需要完成的功能體。是的,當這個函數被調用時,它將myStruct對象的地址。謝謝你的答案,它的工作原理。 – maregor 2014-12-03 00:29:32

+0

在這種情況下,你需要做演員(我的第一個例子)雖然這似乎是一個相當人爲的情況。 – wxs 2014-12-03 00:31:08

+0

我同意。我將不得不詢問這個實施的原因。謝謝。 – maregor 2014-12-03 00:32:05

0

您的函數應該聲明爲指向struct myStruct,否則編譯器無法推斷出ab的類型。

int func(const struct myStruct *a, const struct myStruct *b) 
{ 
    return a->s.st_mode - b->s.st_mode; 
} 

或者,您也可以使用鑄造:

int func(const void *a, const void *b) 
{ 
    return (const struct myStruct*)a->s.st_mode - (const struct myStruct*)b->s.st_mode; 
}