将指针分配给C中的枚举变量的问题

问题描述 投票:2回答:7

我收到“来自不兼容指针类型的协助”的警告。我不明白为什么会发生此警告。除了整数以外,我不知道还有什么要声明“ 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!
c pointers enums warnings int
7个回答
3
投票

因为status是指向枚举error_type的指针,而the_go_status是指向int的指针。它们是指向不同类型的指针。


2
投票

我不确定这是否与您的警告完全相关,但要非常小心地将对局部变量的引用分配给结构中的指针。如果the_go_status是本地变量,则函数返回后,对该本地变量的引用将立即失效。因此,如果您的代码(或其他人的代码)在声明error_struct的函数之外使用了the_go_status的实例,则事情很快就会中断。


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?


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;
}

1
投票

如果要使用指针,则应声明一个指针:

int * the_go_status

否则,您将声明一个原语,该原语不会放置在堆中,而是放置在堆栈中。 (如果对此有误,请更正我的内容)

但是,我完全不明白为什么您要使用指针。只需在您的结构定义中执行以下操作即可:

enum error_type status;

并将最后一行更改为:

error_struct.status = the_go_status; 

0
投票

“ the_go_status”应键入“ enum error_type”。您可以键入def枚举]


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);
}
© www.soinside.com 2019 - 2024. All rights reserved.