list.h: In function ‘CreateNewLinks’:
list.h:29:20: warning: assignment to ‘numbers *’ from incompatible pointer type ‘struct numbers *’ [-Wincompatible-pointer-types]
29 | linked = linked->NextNum;
代码:
typedef struct{
int num;
struct numbers *NextNum;
}numbers;
numbers *CreateNewLinks(){
numbers *head=NULL;
head=malloc(sizeof(numbers));
numbers* linked = head;
char answer;
do{
printf("Enter number : ");
scanf("%d",&linked->num);
printf("Do you want to add (y/n) : ");
scanf("%c",&answer);
if(answer == 'y' || answer == 'Y'){
linked->NextNum = malloc(sizeof(numbers));
linked = linked->NextNum;
}else
linked->NextNum = NULL;
}while(answer =='y' || answer == 'Y');
return head;
}
这个问题如何解决?
首先给结构一个标签:
struct numbers
然后使用该标签定义结构:
struct numbers {
int num;
struct numbers *NextNum;
};
然后为结构类型命名:
typedef struct numbers {
int num;
struct numbers *NextNum;
} numbers;
在您的原始代码中,您有
struct numbers *NextNum;
,但还没有标签 numbers
的声明。因此编译器使用 struct numbers
来引用某些尚未定义的类型。
代码
typedef struct{
开始定义没有标签的结构类型。代码struct numbers
永远不会引用这个结构类型,因为没有标签的结构类型和有标签的结构类型永远不会是相同的类型。
代码
typedef struct{…}numbers;
为结构类型提供了一个名称,numbers
。但名称不是标签。名称 numbers
本身指的是结构类型,但它指的是没有标签的结构。它不是指带有标签struct numbers
的结构类型。 numbers
和 struct numbers
是不同的类型。 (这与 C++ 不同,在 C++ 中,结构、联合和类标签自动成为类型的名称。)
在
linked = linked->NextNum;
中,linked->NextNum
是指向struct numbers
的指针,但linked
是指向numbers
的指针。由于它们是不同的类型,并且它们之间的赋值不合适,因此编译器会警告您。如上所示更改结构定义将解决此问题。
您从未定义过
struct numbers
,因此当它看到它时,它会假设它是与 numbers
类型不同的类型。您可以通过将缺少的标签添加到 typedef
: 来修复它
typedef struct numbers {
int num;
struct numbers *NextNum;
} numbers;
如果您也想在结构内部使用
numbers
,您可以这样做:
typedef struct numbers *numbers;
struct numbers {
int num;
numbers *NextNum;
};
这是一个相当常见的习语。