2013-06-18 53 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'不是吗? –