在C中为指定枚举变量指定指针时出现问题

时间:2010-12-20 19:38:18

标签: c pointers enums warnings int

我收到“不兼容指针类型的分配”的警告。我不明白为什么会发生这种警告。我不知道还有什么可以将“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!

7 个答案:

答案 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);
}