Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.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 在除main之外的函数中无法识别结构_C_Function_Pointers_Parameters_Structure - Fatal编程技术网

C 在除main之外的函数中无法识别结构

C 在除main之外的函数中无法识别结构,c,function,pointers,parameters,structure,C,Function,Pointers,Parameters,Structure,我正在做我的作业,我现在陷入了一个我不知道如何解决的错误。我有一个函数add_name,我试图将一个节点添加到一个双链接列表中,但该函数中的结构无法识别,导致以下错误: “请求非结构或联合中的“第一个”成员” 我的程序有一个主文件、一个头文件和另一个文件“函数”,我在其中编写函数,因为我们目前正在学习如何以模块化方式编程。 下面是我的工作代码片段,我希望我已经足够清楚了 在头文件中: typedef struct node { struct node *next; struct node *pr

我正在做我的作业,我现在陷入了一个我不知道如何解决的错误。我有一个函数add_name,我试图将一个节点添加到一个双链接列表中,但该函数中的结构无法识别,导致以下错误:

“请求非结构或联合中的“第一个”成员”

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

在头文件中:

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;
}
简而言之,这是我现在面临的问题,我对此进行了研究,但仍然没有找到答案,似乎我没有做错什么

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

程序立即崩溃,我认为问题出在这个函数中。我主要这样称呼它:

    create_circular_list(&prime_list);
改变

删除最后一行。变量
p_list
在调用函数时被赋值,您不需要给它赋值(无论如何,即使需要,也会出错)

编辑

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

那么,假设声明

child_list *prime_list;
create_circular_list(&prime_list);
create\u circular\u list
函数中,您有一个指向
child\u list
对象的指针,正如您声明的:

child_list **p_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)->首先指向的结构的成员字段。和
(*p_list)->前面一刻,第一个
已分配
NULL
!您将数据存储在无效地址下,这会导致内存访问异常,程序会终止。

当我尝试分配p
p=(child_list*)malloc(sizeof(child_list)),如果(p_list==NULL)正确,您将在哪一行收到错误
p
类型不同。在
中,如果
块中,将
*
放在所有p\u列表之前。例如:
(*p\u list)->first
p\u list->first=p\u list->last=p:p_list不应该引用
NULL
的情况。这并不能解决上面解决的整个问题,主要感谢您作为参数给出的变量,即prime_list只是一个指针,它的声明类似于:child_list*prime_list,没有给出任何地址。这就是为什么我在函数中为它保留内存。至少这是我在大学里学到的:D
child_list **p_list
*p_list = (child_list*)malloc(sizeof(child_list));
(*p_list)->first = (*p_list)->last = NULL;
(*p_list)->first->next = (*p_list)->first->prev = NULL;