C -> Struct -> Initalisieren

Gast #6055149
Lesenswert?

Hallo (:

Ich habe folgende Frage..
Bitte nicht direkt wieder ausfällig werden..
1
const char* pMsg = "Test"; 
2

3
typedef struct
4
{
5
  const char* pPtr;
6
}sTest_t;
7

8
sTest_t sTest[]=
9
{
10
 { (char*)&pMsg},
11
};

Wenn ich jetzt versuche auf einer Anzeige "sTest.pPtr" auszugeben kommt 
wahrscheinlich nur die Adresse von "pMsg".. Ich sehe nur komische 
Zeichen auf der Anzeige.

Wie initialisiert man das richtig, klappt das überhaupt?

Vielen Dank im voraus :)
#6055163
Lesenswert?

abc schrieb:
> Und &pMsg ist ein char** also nur pMsg

Genau so ist es.

Geht beides bei der Ausgabe:
1
const char* pMsg_1 = "Test_1";
2
const char* pMsg_2 = "Test_2";
3

4
typedef struct
5
{
6
  const char* pPtr;
7
} sTest_t;
8

9
sTest_t sTest[] =
10
{
11
  {(char*)pMsg_1},
12
  {(char*)pMsg_2}
13
};
14

15
/******************************************************************************/
16
int main()
17
{
18
  printf("%s\n", sTest[0].pPtr);
19
  printf("%s\n", sTest[1]);
20

21
  printf("\n");
22
  system("PAUSE");
23
  return 0;
24
}
#6055164
Lesenswert?

Warum hast du da gecastet? Bevor man einen Cast hinschreibt, sollte man 
immer genau wissen, wieso er nötig ist. Und nein, "weil sonst eine 
Warnung kommt" ist keine gültige Antwort. ;-)
pMsg ist ein Zeiger auf einen const char. Du übergibst aber nicht den 
Wert dieses Zeigers in deine Struktur, sondern seine Adresse. Lass das & 
weg, dann passt es. Und dann brauchst du auch den Cast nicht.
Gast #6055200
Lesenswert?

Nimm mal "const char pMsg_1[]" statt "const char* pMsg_1". In letzterem 
fall ist pMsg_1 das Symbol, welches auf die Variable zeigt, welches den 
Pointer enthält, welcher auf den Text zeigt. In ersterem Fall hingegen 
zeigt das Symbol direkt auf den Anfang der Daten, und nicht auf nen 
pointer, den man noch ändern könnte. Die Addresse von einem Array kann 
man hier als Konstant betrachten, der wert von einer pointer variable, 
nicht.
Moderator Persönliche Seite #6055201
Lesenswert?

Anja F. schrieb:
> In der main() klappt das..

Da passiert die Initialisierung zur Laufzeit des Programms.

> Über der main() ( wie nennt man diesen Vorgang?! ) klappt das nicht.

Ich würde den Vorgang "Definition mit einhergehender Initialisierung" 
nennen.

Du kannst da keine Struct mit variablen Inhalten füllen. Denn diese 
Initialisierung passiert zur Compile Time, nicht zur Laufzeit.

> Da
> meckert und sagt:initalizer element is not constant

Initialisierung zur Compile Time geht nur mit Konstanten, nicht mit 
Variablen.

Schreibe also:
1
typedef struct
2
{
3
  const char * pPtr;
4
} sTest_t;
5

6
sTest_t sTest[] =
7
{
8
  { "Test_1" },
9
  { "Test_2" }
10
};

Das funktioniert. Oder initialisiere die Struct zur Laufzeit in der 
main-Funktion. Da gehts dann auch mit Variablen. Denn diese haben dann 
auch einen definierten Wert.
Moderator #6055385
Lesenswert?

Da das Struct-Element richtigerweise als const char * deklariert ist,
muss das const der globalen Variablen auch nicht weggecastet werden (was
ohnehin ein sehr zweifelhaftes Vorgehen wäre). Die hässlichen Casts
können also ersatzlos entfallen:

1
const char msg1[] = "Test 1"; 
2
const char msg2[] = "Test 2"; 
3

4
typedef struct
5
{
6
  const char *pMsg;
7
} sTest_t;
8

9
sTest_t sTest[] =
10
{
11
  { msg1 },
12
  { msg2 }
13
};

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren