3 Stimmen

Problem bei der Zuweisung eines Zeigers auf eine Enum-Variable in C

Ich erhalte die Warnung "Zuweisung von inkompatiblem Zeigertyp". Ich verstehe nicht, warum diese Warnung auftritt. Ich weiß nicht, als was ich die Variable "the_go_status" sonst deklarieren könnte, außer als Integer. (Hinweis: Dies ist nicht der gesamte Code, sondern nur eine vereinfachte Version, die ich zur Veranschaulichung des Problems veröffentlicht habe).

Die Warnung tritt in der letzten Zeile des Beispiels auf, das ich unten eingefügt habe.

//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!

3voto

Jonathan Wood Punkte 61798

Denn status ist ein Zeiger auf enum error_type, und the_go_status ist ein Zeiger auf einen int. Sie sind Zeiger auf unterschiedliche Typen.

3voto

Adam Maras Punkte 25358

Ich bin mir nicht sicher, ob dies genau mit Ihrer Warnung zusammenhängt oder nicht, aber seien Sie très Vorsicht bei der Zuweisung von Verweisen auf lokale Variablen zu Zeigern innerhalb von Strukturen. Wenn the_go_status eine lokale Variable ist, wird der Verweis auf diese Variable ungültig, sobald Ihre Funktion zurückkehrt. Wenn also Ihr Code (oder der Code einer anderen Person) Ihre Instanz von error_struct außerhalb der deklarierenden Funktion the_go_status werden die Dinge schnell kaputt gehen.

3voto

Joey Adams Punkte 39825

Der Grund dafür ist enum error_type * ist nicht kompatibel mit int * , da sie auf Werte unterschiedlichen Typs (und möglicherweise sogar unterschiedlicher Größe) verweisen. Sie sollten deklarieren the_go_status als:

enum error_type the_go_status;

Obwohl das einfache Casting des Zeigers (d.h. (enum error_type *)&the_go_status ) wird die Warnung verschwinden lassen, kann aber auf einigen Plattformen zu Fehlern führen. Siehe Ist sizeof(enum) == sizeof(int), immer?

1voto

st-h Punkte 2314

Sollten Sie einen Zeiger deklarieren, wenn Sie einen Zeiger verwenden wollen:

int * the_go_status

sonst deklarieren Sie ein Primitivum, das nicht auf dem Heap, sondern auf dem Stack abgelegt wird. (bitte korrigieren Sie mich, wenn ich mich da irre)

Ich verstehe allerdings nicht, warum Sie überhaupt einen Zeiger verwenden wollen. Machen Sie einfach etwas wie dieses in Ihrer Strukturdefinition:

enum error_type status;

und ändern Sie Ihre letzte Zeile in:

error_struct.status = the_go_status;

1voto

Nishad Sandilya Punkte 15
//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);
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X