在main以外的函数内部无法识别的结构

时间:2014-04-16 10:15:27

标签: c function pointers parameters structure

我正在完成我的任务,目前我遇到了一个我不知道如何解决的错误。我有一个函数add_name,我尝试将一个节点添加到双向链表中,但是在函数内部无法识别结构,给出了以下错误:

“在某个结构或联合的东西中首先要求成员'

。”

我的程序有主文件,头文件和另一个文件“functions”,我编写函数,因为我们正在学习如何以模块化方式编程。 这是我工作的代码片段,我希望我已经足够清楚了。

在头文件中:

typedef struct node
{
struct node *next;
struct node *prev;
char name[50];
}NodeT;

typedef struct list_header
{/*header cell for the list*/
NodeT *first;
NodeT *last;
}child_list;

void add_name(child_list **p, char[]);

在创建列表后的main中,我只需调用add_name函数,如下所示:add_name(& prime_list,name);

在功能中:

void add_name(child_list **p_list, char name[]{
NodeT *p;
p = (child_list*)malloc(sizeof(child_list));
strcpy(p->name,name);
if (p_list==NULL)
{/*list is empty*/
    p_list->first=p_list->last = p;
    p_list->first->next=p_list_first->prev = NULL;
    p_list->last->next=p_list->last->prev = NULL;
    p_list=p;
}

简短地说,这是我现在面临的问题,我对此做了研究,但仍未找到答案,似乎我没有做错任何事。

上面的问题已经解决了,但我还有另一个问题,当我尝试在函数中创建列表时,所有规范都保持不变。 (这是关于同一个程序)

void create_circular_list (child_list** p_list)
{/*creates an empty list; reserves memory for the header cell*/
p_list =(child_list*)malloc(sizeof(child_list));
(*p_list)->first=(*p_list)->last=NULL;
(*p_list)->first->next=(*p_list)->first->prev=NULL;
(*p_list)->last->next=(*p_list)->last->prev=NULL;}

程序立即崩溃,我发现问题出现在这个功能中。我在main中这样称呼它:

    create_circular_list(&prime_list);

2 个答案:

答案 0 :(得分:0)

更改

NodeT *p;

struct child_list *p;

答案 1 :(得分:0)

void create_circular_list (child_list** p_list)
{/*creates an empty list; reserves memory for the header cell*/
    p_list =(child_list*)malloc(sizeof(child_list));

删除最后一行。当你调用函数时,变量p_list被赋值,你不需要为它赋一个新对象(无论如何,即使你需要,你做错了)。

修改

对不起,我没想到,你没有出示声明。通常,声明指针变量并且不为其赋值是不好的做法。如果很快就会完成一项任务,你可以这样做,但如果在别的地方完成,在其他函数中,最好初始化一个指针指向一些已经存在的对象,或者通过立即分配或者只是给它一个空值。

所以,假设声明

child_list *prime_list;
create_circular_list(&prime_list);

你有一个指向child_list函数中create_circular_list对象指针的指针,就像你声明:

child_list **p_list

然后为child_list对象分配一个内存块,并指向它。因此,您不应将其分配给p_list,而应分配给prime_list,即p_list指向的指针 - 只需在作业左侧添加一个星号:

*p_list = (child_list*)malloc(sizeof(child_list));

接下来,正确初始化列表对象以显示列表为空:

(*p_list)->first = (*p_list)->last = NULL;

(尽管您可能之前检查过,如果从malloc返回的指针不是NULL),那么...

(*p_list)->first->next = (*p_list)->first->prev = NULL;

您尝试将NULL分配给结构的成员字段'指向'按(*p_list)->first。并且(*p_list)->first之前已被NULL分配了{{1}}!您将数据存储在无效地址下,这会导致内存访问异常并终止程序。