C -> Struct -> Initalisieren

Gast #6055149
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
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
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 #6055183
In der main() klappt das..
Über der main() ( wie nennt man diesen Vorgang?! ) klappt das nicht. Da 
meckert und sagt:
1
initalizer element is not constant
Gast #6055200
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
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
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

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.