Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 警告:取消引用‘;无效*’;指针_C - Fatal编程技术网

C 警告:取消引用‘;无效*’;指针

C 警告:取消引用‘;无效*’;指针,c,C,我正在做一个家庭作业,我想知道是否有人能帮我弄清楚错误“警告:取消引用'void*'指针”对我的代码意味着什么。多谢各位 错误警告: circular_list.c: In function ‘allocate_node’: circular_list.c:36(line: DATA(lst) = data;): warning: dereferencing ‘void *’ pointer circular_list.c:36(line: DATA(lst) = data;): error:

我正在做一个家庭作业,我想知道是否有人能帮我弄清楚错误“警告:取消引用'void*'指针”对我的代码意味着什么。多谢各位

错误警告:

circular_list.c: In function ‘allocate_node’:
circular_list.c:36(line: DATA(lst) = data;): warning: dereferencing ‘void *’ pointer
circular_list.c:36(line: DATA(lst) = data;): error: request for member ‘datapointer’ in something not a structure or union
circular_list.c:37(line: NEXT(lst) = NULL;): warning: dereferencing ‘void *’ pointer
circular_list.c:37(line: NEXT(lst) = NULL;): error: request for member ‘next’ in something not a structure or union
循环清单c

#include <stdio.h>
#include <stdlib.h>
#include "globals.h"
#include "circular_list.h"

typedef struct node *list_rep;

typedef struct node {
    generic_ptr datapointer;
    list_rep    next;
} node;


#define DATA(lst) ((lst)->datapointer)
#define NEXT(lst) ((lst)->next)

#define TOLIST(list_rep) ((list)    (list_rep))
#define TOREP(lst)       ((list_rep)(lst))

#define TOLISTPTR(list_rep_ptr) ((list *)    (list_rep_ptr))
#define TOREPPTR(lst_ptr)       ((list_rep *)(lst_ptr))

static status allocate_node (list_rep *p_lst, generic_ptr data)
{
    list lst = (list) malloc(sizeof(node));

    if (lst == NULL)
            return ERROR;

    *p_lst = lst;
    DATA(lst) = data;
    NEXT(lst) = NULL;

    return OK;
}

static void free_node (list *p_lst)
{
    free(*p_lst);
    *p_lst = NULL;

extern status init_circ_list (list *p_lst)
{
    *p_lst = NULL;
    return OK;
}
extern bool   empty_circ_list (list lst)
{
    return (lst == NULL) ? TRUE : FALSE;
}

status circ_insert (list *p_lst, generic_ptr data)
{
    list_rep lst, *p_lst_rep = TOREPPTR(p_lst);

    if (allocate_node(&lst, data) == ERROR)
            return ERROR;

    if (empty_circ_list(*p_lst)) {
            NEXT(lst) = lst;
            *p_lst_rep = lst;
    } else {
            NEXT(lst) = NEXT(*p_lst_rep);
            NEXT(*p_lst_rep) = lst;
    }
    return OK;
}
globals.h

#ifndef _GLOBALS_H
#define _GLOBALS_H

typedef enum {OK, ERROR} status;
typedef enum {FALSE = 0, TRUE = 1} bool;

typedef void *generic_ptr;

typedef unsigned char byte;

#define ABSTRACT_TYPE(t)    
typedef void *(t)

#endif

列表属于
void*
类型,因此应该是

`DATA(*plst) = data;`
`NEXT(*plst) = NULL;`

不能取消对void*指针的引用。如果要访问节点结构,需要将其强制转换回节点类型。通读一遍以便更好地理解

我敢打赌答案隐藏在
抽象类型
宏后面-那是什么?我猜那里潜藏着一个
void*
。错误行号与您发布的代码不匹配。我刚刚修复了我在发布后意识到的问题。对不起David@MichaelBurr如果你能给我解释一下,我对抽象类型的真正含义不太肯定。我想抽象类型是你的。它是如何定义的?看起来它可以在
globals.h
中找到。编译器错误表明它看起来是这样的:
#define ABSTRACT_TYPE void*
现在我得到一个错误,说循环_list.c:42:warning:“free_node”已定义但未使用,它是:static void free_node(list*p_lst)(从第42行开始:)“{”free(*p_lst);*p_lst=NULL;}同样,在free中,您正在取消对void*类型的引用,函数应该是void free_node(list_rep*p_lst)我更改了它,但仍然得到错误,错误是关于“{”我不知道这是什么意思。你粘贴的代码中有一个拼写错误,遗漏了右大括号。我不确定这是否是问题。静态void free_节点(list*p_lst){free(*p_lst);*p_lst=NULL;//遗漏了右大括号。我不确定我在家的常规代码中是否遗漏了右大括号。我不确定我在其他地方是否遗漏了右大括号。
`DATA(*plst) = data;`
`NEXT(*plst) = NULL;`