ncurses:警告:解除引用'void *'指针

时间:2013-06-18 17:03:17

标签: c gcc ncurses

我正在尝试理解NCURSES源代码并在错误点处进行了攻击。代码如下:

#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

我想知道错误和解决方案的原因是什么?

3 个答案:

答案 0 :(得分:2)

此处发生错误:

*((SP)->_current_attr))

这相当于(据我所知)到

*(SP->_current_attr)

由于_current_attr的类型为void*,因此void*被取消引用,这是非法的。

解决此问题的一种方法是为_current_attr提供一种类型。

struct screen {
  int *_current_attr;
};

答案 1 :(得分:1)

_current_attr指针已声明为void *。在访问/取消发送此指针之前,您需要键入强制转换,以便它指向您在此指针中期望的相关类型。

答案 2 :(得分:0)

它告诉你到底出了什么问题:你正在取消引用一个无效指针。在尝试获取指针之前,您必须告诉编译器指针指向的是什么类型的东西。 void *只是说“我会在运行时告诉你”。 SP指向struct screen,因此应将其声明为struct screen *。成员_current_atrr,好吧,我不知道它应该指向什么。你正在用它做数学,所以也许它应该是int *?但是,你还需要为它分配内存。