我正在尝试理解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
我想知道错误和解决方案的原因是什么?
答案 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 *
?但是,你还需要为它分配内存。