2016-04-21 16 views
7

So habe ich ein struct:Wie initialisiere ich eine const int const * Variable?

typedef struct myStruct 
{ 
    const int *const array_ptr; 
} myStruct_s; 

Ich habe eine const Array von int:

const int constArray[SIZE1] = 
{ 
     [0] = 0, 
     [1] = 1, 
     [2] = 2, 
     //... 
}; 

Jetzt habe ich eine const Reihe von myStruct_s mit designierten Initialisierer initialisiert:

const myStruct_s structArray[SIZE2] = 
{ 
     [0] = 
      { 
        .array_ptr = &constArray 
      }, 
     //... 
} 

Ich bekomme die Warnung:

ein Wert vom Typ "const int (*) [SIZE1]" kann nicht eine Einheit vom Typ "const int * const"

Wie kann ich richtig diesen Zeiger initialisieren initialisiert werden?

Ich möchte vermeiden:

const myStruct_s structArray[SIZE2] = 
{ 
     [0] = 
      { 
        .array_ptr = (const int *const) &constArray 
      }, 
     //... 
} 

Wenn möglich, da ich fühle mich wie ich den Compiler sagen „Ich weiß nicht, was ich tue, sondern nur die Art nicht überprüfen Sie bitte“ ...

Danke für Ihre Hilfe :).

+1

'array_ptr = & constArray [0];' – Nadir

+3

Array-Indizes beginnen bei 0. Ihre Zuweisungen ('[1] = 1') beginnen bei 1. Nicht im Zusammenhang mit dem Problem, aber sieht verdächtig aus. – davmac

+0

@davmac: Sie haben Recht! Tatsächlich benutze ich 'enum' als Indizes, um die Arrays zu füllen. Ich benutze nie magische Zahlen :). Ich habe meinen Code etwas zu schnell vereinfacht! – Plouff

Antwort

11

constArray ist bereits (zerfällt in) ein Zeiger, möchten Sie

.array_ptr = constArray 

oder

.array_ptr = &constArray[0] /* pointer to the first element */ 

statt

.array_ptr = &constArray /* you don't want the address of */ 

Betrachten

int a[] = {1,2}; 
int *p = &a; 
Diese

ist nicht korrekt, da p einen Zeiger auf einen int (&a[0] oder einfach a) will, nicht einen Zeiger auf ein Array von 2 int (&a)

+1

Richtig, aber könnte eine Erklärung dafür verwenden, warum '& constArray' nicht funktioniert. – davmac

+0

Ah, ok, ich werde versuchen, aber mein Englisch ist sehr arm :) –

+0

@davmac, fertig, fühle mich frei, die Bearbeitung zu verbessern –

-1

Sie das Ampersand aus der Zeit vor constArray entfernen sollen, die dann ergibt einen kompatiblen Zeigertyp. Der Grund: Arrays werden ähnlich wie Zeiger in C behandelt. constArray ist also bereits effektiv Aber wenn Sie die Adresse nehmen, d. H. &constArray, erhalten Sie tatsächlich einen Typ, der mit const int *const *const kompatibel wäre.

+4

Nein. Sie erhalten einen Typ, der mit 'const int (*) []' kompatibel ist. Arrays werden nicht zu Zeigern, wenn sie der Operand von '&' sind. – davmac

+3

Der zweite Absatz ist Müll –

Verwandte Themen