2013-06-18 52 views
3

我想了解NCURSES源代碼並觸及錯誤點。該代碼如下:ncurses:警告:取消引用'void *'指針

#include<stdio.h> 


struct screen { 
    void *_current_attr; 
}; 

typedef struct screen SCREEN; 

SCREEN * SP = ((void *)0); 

int main(int argc, char **argv){ 
    ((*(SP)->_current_attr)) = (
           ((*((SP)->_current_attr))) & 
           ~((~(1UL - 1UL)) << ((0) + 8))) | ((1UL - 1UL) 
           ); 
    return 0; 
} 

我收到錯誤信息爲:

In function ‘main’: 
warning: dereferencing ‘void *’ pointer 
warning: dereferencing ‘void *’ pointer 
error: void value not ignored as it ought to be 
error: invalid use of void expression 

我想知道什麼是錯誤和解決方案的原因吧?

+0

沒有錯誤發生在哪一行?我認爲'main'的第一行? –

+0

第13,14,15,16行錯誤 – Vineet1982

+0

這就是'main'內部賦值語句的所有四行,對吧? –

回答

2

發生該錯誤的位置:

*((SP)->_current_attr)) 

這相當於(據我可以告訴)到

*(SP->_current_attr) 

由於_current_attrvoid*型的,一個void*被解除引用,這是非法。你能解決這個問題

一種方式是通過給類型_current_attr

struct screen { 
    int *_current_attr; 
}; 
+0

不能解決錯誤 – Vineet1982

+0

那麼,問題可以通過刪除'main'的內容來解決。我不知道你在做什麼,所以除非你解釋'main'應該做什麼,否則我不能「解決」錯誤。 –

+0

感謝您讓我知道錯誤的原因 – Vineet1982

1

_current_attr指針已被聲明爲void *。在訪問/去除這個指針之前,你需要輸入cast,以便它指向你在這個指針中所期望的相關類型。

+1

如何做到這一點類型案例 – Vineet1982

+0

通常來說,定義指針是最好的,所以它首先是預期的類型。只有在可能要在代碼的不同位置指向不同類型的情況下,才能使用「void *」。 –

+0

在取消引用void *指針之前,請將其轉換爲所需的類型。但是你需要定義這個「必需類型」。通過查看您的代碼行((*(SP) - > _ current_attr))=(((*((SP) - > _ current_attr)))(( - (1UL - 1UL))<<((0) + 8)))| ((1UL-1UL)); 我認爲無符號長*指針會工作。 – uni

0

它告訴你到底發生了什麼問題:你在解引用一個void指針。在嘗試獲取指針之前,必須告訴編譯器指針指向什麼類型的東西。 void *只是說「我會在運行時告訴你」的方式。 SP指向struct screen,所以應該聲明爲struct screen *。成員_current_atrr,好吧,我不知道它應該指向什麼。你在做數學,所以也許它應該是int *?但是,你還需要爲它分配內存。

+0

如何分配內存給它 – Vineet1982

+0

這取決於你想要做什麼。我不能爲你寫代碼,只有你知道你想要做什麼。 –

+0

'typedef'導致SP被聲明爲'struct screen'不是嗎? –