Deklaration Liste von Strings

Gast #4332719
Hallo Leute !

Ich möchte eine Stringlist deklarieren, etwa so:

typedef struct
{
  uint8_t anzahl;
  char *s[];
} tl;

const tl = {3,"murks","mehrmurks","nochmehrmurks"};

Die Anzahl der Strings soll variabel sein. Im Printzip geht
das auch so, man bekommt nur einen Sack voll Warnungen, weil
zuviel Initializer Elemente vorhanden sind. Was ja auch stimmt.

Nur wie deklariert man so etwas?

MfG
Edgar
Warum benötigst du dazu einen eigenen Typ? Nimm ein Array aus Zeigern 
und setze den letzten Zeiger auf NULL. So kann man den letzten Eintrag 
sehr einfach erkennen und es ist keine zusätzliche Anzahl-Variable 
vorhanden, die einen falschen Wert haben kann.
1
const char * const List[] = {
2
  "Hello world!",
3
  "Text",
4
  NULL
5
};
iwoasesned schrieb:

> Nur wie deklariert man so etwas?

Du meinst: wie intialisiert man so etwas.

So wie immer, wenn in einer struct eine darunterliegende Datenstruktur 
enthaletn ist. Mit zusätzlichen { } Klammern, die die eingebettete 
Datenstruktur kenntlich machen
1
const tl = {3, { "murks","mehrmurks","nochmehrmurks" } };
Yalu X. schrieb:
> Man sollte aber beachten, dass die Initialisierung von Flexible Array
> Members eine Erweiterung des GCC gegenüber dem C-Standard ist. Bei
> anderen Compilern ist das evtl. ein Fehler.

Korrekt, hab das nochmals nachgelesen. In meiner Variante habe ich einen 
Zeiger auf einen Zeiger verwendet, weil ich die flexiblen Arrays so oder 
so nicht mag. Ein Konstrukt, das nur ein flexibles Array zulässt, ist 
für mich unbrauchbar. Was wenn ich mehrere benötigte? Dann lieber einen 
Zeiger, auch wenn es nur ein Array ist. So ist es wenigstens immer 
gleich.

PS: Mit dem entsprechenden Compilerflag wird man vom GCC auch gewarnt:
1
warning: initialization of a flexible array member [-Wpedantic]

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 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.