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