String-Array an Funktion übergeben

German

Well-Known Member
c-b Experte
#21
Nicht so kompliziert ...
C:
#include <stdio.h>
#include <string.h>

#define AnzFarben 4
#define StrMax 64

void Ausgabefunktion(char Stringarray[][StrMax], size_t Laenge)
{
  for (size_t i = 0; i < Laenge; puts(Stringarray[i++]));
}

int main(void)
{
    char vFarben[AnzFarben][StrMax] = {0};

    strcpy(vFarben[0], "Karo");
    strcpy(vFarben[1], "Herz");
    strcpy(vFarben[2], "Pik");
    strcpy(vFarben[3], "Kreuz");
    Ausgabefunktion(vFarben, AnzFarben);

    strcpy(vFarben[2], "gruen");
    Ausgabefunktion(vFarben, AnzFarben);

    return 0;
}
Initialisierung von Arrays/Strukturen einfach mit {0} um alle Elemente/Member auszunullen. Egal welcher Typ.
 
#22
Ähhm...sorry, ich muss hier gerade mal runterbremsen, ich brauch's für Doofe:

C:
char vFarben[AnzFarben][StrMax] = {0};
füllt die letzte Ebene mit Nullen auf, oder?
Also: [Zeigername vFarben] zeigt auf ein Array mit der Länge [AnzFarben], das mit Zeigeradressen bestückt ist und jeder dieser Zeiger Zeigt auf ein Array mit der Länge StrMax, das dann eine Null enthält?/StrMax-Anzahl von Nullen?

Jetzt sehe ich gerade, dass Du im letzten Codeschnipsel ja doch einfach einen String mit strcpy in's Array kopierst. Ich dachte das geht nicht:
C:
strcpy(vFarben[2], "gruen");
Was ist denn aus der Notwendigkeit des Pufferarrays geworden?

Die Strings werden in meinem Fall aus Datei gelesen und liegen daher in einer String-Variable (also einem 1D-Array). Wenn ich jetzt mit Stringcopy in ein 2D-Array mit nur einer Null pro Eintrag reinkopiere, werden doch sicher Grenzen überschrieben.
 

German

Well-Known Member
c-b Experte
#23
#24
Das war doch vorher auch schon so. Meinst Du wegen der konstanten String-Länge? Dann lag's also doch am Array, das vorher als Array aus Pointern definiert war, jetzt aber als 2-D-Array.
Damit gab's bei mir mit dem Auslesen Probleme. Ich werde es dennoch erneut probieren. Vielen Dank also erstmal.
 

German

Well-Known Member
c-b Experte
#26
Das war doch vorher auch schon so.
Der Variableninhalt war nicht const deklariert und der Compiler hat nicht gemeckert und trotzdem war der Inhalt der Stringliterale nicht zu überschreiben. Kurze Internetrecherche hat ergeben, dass dieses Verhalten auf den meisten Betriebssystemen normal ist. Solange ich mit C spiele habe ich das allerdings auch noch nie probiert, da es unsinnig ist. Du wärst dann sowieso auf die Anzahl Zeichen beschränkt, die das Literal hatte. Wen du vorhast es zu überschreiben ist die Gefahr enorm hoch, dass du die Arraygrenze überschreitest. Darum Puffer mit ausreichender Größe anlegen. Wenn du statt 64 eine 1024 für StrMax definierst um auf der sicheren Seite zu sein, ist das auch gerade mal 1 KB und bringt deinen Arbeitsspeicher längst nicht dazu sich merklich zu verringern.
 
Oben