我收到“不兼容指针类型的分配”的警告。我不明白为什么会发生这种警告。我不知道还有什么可以将“the_go_status”变量声明为整数以外的其他变量。 (注意:这不是所有代码,只是我发布的简化版本来说明问题。)
警告发生在下面包含的示例的最后一行。
//In a header file
enum error_type
{
ERR_1 = 0,
ERR_2 = 1,
ERR_3 = 2,
ERR_4 = 4,
};
//In a header file
struct error_struct
{
int value;
enum error_type *status;
};
//In a C file
int the_go_status;
the_go_status = ERR_1;
//Have the error_struct "status" point to the address of "the_go_status"
error_struct.status = &the_go_status; //WARNING HERE!
答案 0 :(得分:3)
因为status是枚举error_type的指针,而the_go_status是指向int的指针。它们是指向不同类型的指针。
答案 1 :(得分:2)
我不确定这是否与您的警告完全相关,但是非常小心地将对局部变量的引用分配给结构中的指针。如果the_go_status
是本地的,则只要函数返回,对该本地的引用将变为无效。因此,如果您的代码(或其他人的代码)在声明error_struct
的函数之外使用the_go_status
的实例,则事情很快就会中断。
答案 2 :(得分:2)
这是因为enum error_type *
与int *
不兼容,因为它们指向不同类型的值(甚至可能是不同的大小)。您应该将the_go_status
声明为:
enum error_type the_go_status;
虽然简单地转换指针(即(enum error_type *)&the_go_status
)会使警告消失,但可能会导致某些平台出现错误。见Is the sizeof(enum) == sizeof(int), always?
答案 3 :(得分:1)
试试这个:
#include <stdio.h>
enum error_type
{
ERR_1=0
,ERR_2=1
,ERR_3=2
,ERR_4=4
};
struct error_struct
{
int value;
error_type status;
};
int main(int argc, char* argv[])
{
printf("Start\n");
error_type the_go_status=ERR_1;
error_struct err;
err.value=5;
err.status=the_go_status;
printf("Done\n");
getchar();
return 0;
}
答案 4 :(得分:1)
int * the_go_status
否则你声明一个原语,它不是放在堆上,而是放在堆栈上。 (请在纠错时纠正我的错误)
但是,我不明白你为什么要使用指针。只需在结构定义中执行以下操作:
enum error_type status;
并将您的最后一行更改为:
error_struct.status = the_go_status;
答案 5 :(得分:0)
“the_go_status”应输入“enum error_type”。 你可以输入定义枚举
答案 6 :(得分:0)
//This might be the simplest
#include<stdio.h>
typedef enum {err_1=0,err_2=1,err_3=2,err_4=4}error;
typedef struct
{
int val;
error* status;
}errval;
int main() {
error the_go_status=err_1;
errval val1;//just a variable name for the struct
val1.status=&the_go_status;
printf("%d",val1.status);
}