4

我正在尝试理解 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

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

4

3 回答 3

2

错误发生在这里:

*((SP)->_current_attr))

这相当于(据我所知)

*(SP->_current_attr)

由于_current_attris 类型void*, avoid*被取消引用,这是非法的。

解决这个问题的一种方法是给_current_attr.

struct screen {
  int *_current_attr;
};
于 2013-06-18T17:24:27.560 回答
1

_current_attr 指针已被声明为 void*。在访问/取消引用此指针之前,您需要键入 cast,以便它指向您在此指针中期望的相关类型。

于 2013-06-18T17:13:39.340 回答
0

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

于 2013-06-18T17:14:07.907 回答