使用C指针和struct';s 描述

使用C指针和struct';s 描述,c,pointers,struct,C,Pointers,Struct,我试图理解C语言中的指针、链表、结构等。作为一种学习经验,我编写了这个小程序,它: 定义一些基本结构并使用结构指针在它们之间创建链接 迭代整个链表并打印出所有变量 创建另一个结构,但不将其插入到链接列表中 调用函数insertEntry,该函数在链表的一个元素与其直接跟随者之间插入给定的结构 到目前为止我所做的: 表示:“这实际上意味着在源代码结构的其他地方有另一个函数/声明[…]具有不同的函数签名。” 我已经检查了函数定义、声明及其调用中的拼写错误 我已经检查了参数的数量和类型。ins

我试图理解C语言中的指针、链表、结构等。作为一种学习经验,我编写了这个小程序,它:

  • 定义一些基本结构并使用结构指针在它们之间创建链接
  • 迭代整个链表并打印出所有变量
  • 创建另一个结构,但不将其插入到链接列表中
  • 调用函数
    insertEntry
    ,该函数在链表的一个元素与其直接跟随者之间插入给定的结构
到目前为止我所做的:
  • 表示:“这实际上意味着在源代码结构的其他地方有另一个函数/声明[…]具有不同的函数签名。”

    • 我已经检查了函数定义、声明及其调用中的拼写错误
    • 我已经检查了参数的数量和类型。
      insertEntry
      的两个参数始终是同一类型的两个结构
  • 表示:“您忘记了包含“client.h”,因此定义是正确的”,但我也检查了这一点。文件系统上的实际文件名和
    #include

=>我不知道我的错误在哪里


ex1\u insertStructure\u linkedList.h:

void insertEntry(结构条目,结构条目);

ex1\u insertStructure\u linkedList.c:

#包括
#包括“ex1\u insertStructure\u linkedList.h”
结构条目{
int值;
结构条目*下一步;
};
//clangtidy:“insertEntry”的冲突类型[clang诊断错误]
void insertEntry(结构项给定项,结构项项项到插入项){
printf(“打印内部插入方法:%i\n”,给定\u entry.value);
结构项*第二个\u指针=(给定的\u项);
//Cytoytotox插入现在是中间元素。
给定的\u entry.next=&entry\u to\u insert;
//第三要素
输入到插入。下一步=第二个指针;
返回;
}
int main(int argc,char*argv[]){
结构条目n1、n2、n3;
n1.数值=1;
n1.next=&n2;
n2.1值=32;
n2.next=&n3;
n3.0值=34242;
n3.next=(结构项*)0;
结构项*列表_指针=&n1;
while(列表指针!=(结构项*)0){
int printValue=(*列表指针).value;
列表指针=(*列表指针);
printf(“%i\n”,printValue);
}
printf(“--------------\n”);
列表指针=&n1;
结构条目a;
a、 数值=999999;
a、 下一步=(结构项*)0;
//ClangTid:参数类型“struct entry”不完整[clang诊断错误]
插入(n1,a);
while(列表指针!=(结构项*)0){
int printValue=列表\指针->值;
列表指针=列表指针->下一步;
printf(“%i\n”,printValue);
}
返回0;
}
您需要在文件
ex1\u insertStructure\u linkedList.h
中“向前声明”结构
条目
,即在函数声明之前:
void insertEntry(结构条目,结构条目),即放入以下
结构项在该函数声明之前

这是因为当编译器遇到
insertEntry(struct entry,struct entry)时,它不知道有关结构项的任何信息。通过向前声明
struct entry
,您可以“确保”编译器在源文件中的某个地方定义了
struct entry

您需要在文件
ex1\u insertStructure\u linkedList.h
中“向前声明”struct
条目
,即在函数声明之前:
void insertEntry>(struct entry,struct entry);
,即将以下
struct entry;
放在该函数声明之前


这是因为当编译器遇到
insertEntry(struct entry,struct entry);
时,它对
struct entry
一无所知。通过向前声明
struct entry
,可以“确保”向编译器声明
结构项
是在源文件中的某个位置定义的。

您应该将
结构项
声明放在ex1\u insertStructure\u linkedList.h中:

struct条目{
int值;
结构条目*下一步;
};
void insertEntry(结构条目,结构条目);

您应该在ex1\u insertStructure\u linkedList.h中放置
struct条目
声明:

struct条目{
int值;
结构条目*下一步;
};
void insertEntry(结构条目,结构条目);

您可以从描述实际错误是什么以及它在哪里开始。@2501我不理解您的回答,实际错误消息包含在源代码中-我的linter/checking程序投诉的地方。您需要“向前声明”文件
ex1\u insertStructure\u linkedList.h
中的结构
条目
,即在函数声明之前:
void insertEntry(结构条目,结构条目);
,即在该函数声明之前放置以下
结构项;
。@nibro ooh,这修复了我的错误,谢谢!如果您将您的评论转化为答案,我将向上投票并将其标记为接受答案。当我使用GCC 6.3.0编译标题时(在macOS Sierra 10.12.3上)而且没有任何警告选项,我得到这样一条消息:
在chkhdr-2684.c:1:0:
-
xyz.h:1:25:警告:在参数列表中声明的“struct entry”在该定义或声明之外将不可见
-
void insertEntry(struct entry,struct entry);
。如果您的编译器没有生成此类警告,您需要使用更好的编译器,或者启用更多警告。如果您看到此类警告但在问题中没有提及,则您肯定应该这样做。您可以从de开始