Char Array in Char Pointer kopieren ???



  • Hi ich habe in meinem Programm einen festes char array:

    char *array1[] = {"...","..."};
    

    und diese möchte ich jetzt jetzt in ein in der größe nicht festgelegtes array kopieren und bis her ist mir eine lösung dafür nur so eingefallen:

    char **array2;
    

    das kopieren klappt ja auch nur kann ich dann nicht darauf zugreifen das Programm stürzt einfach immer ab.
    kann mir da wer helfen?



  • Das char *array1[] = {"...","..."}; ist kein char-Array sondern ein Array von Pointern auf char. (declare array1 as array of pointer to char)
    Die Zeiger in dem Array zeigen auf die Stringliterale.
    Du brauchsr Speicher für Das Array und für die Literale.

    Das char **array2; ist ein Zeige auf einen Zeiger auf char. Das ist erstmal nur der Zeiger. Du brauchst auch noch Speicher wo der Zeiger hinzeigen soll.

    Was willst du genau machen?
    Und ohne Code (von dir) nichts los.



  • ok also ich schreibe ein programm und es ist abhängig vom benutzer was in dem array steht wenn er keine angaben macht dann wird halt dieses vorgefertigte array genommen falls er jedoch eine datei angibt soll die halt jede zeile als ein einzelner string in das array gepackt werden, und die größe die der benutzer angibt ist undefiniert, später muss ich dann halt das array verändern können und es anzeigen lassen. richtigen code kann ich noch nicht posten da doch vieles hiervon abhängt 😃 .



  • Willst du mehr Strings verwalten oder nur welche mit einer anderen Länge?

    Willst du statt
    char *array1[] = {"a", "b"};
    dann
    char *array1[] = {"aaaa", "bbbb"};
    oder
    char *array1[] = {"xxx", "y", "c", "ddd"};
    

    😕



  • ehm ich muss eigentlich nur welche gleicher länge haben
    also kann der user z.B. in der datei

    char *array[] = {"dsd", "fdg"};
    oder auch
    char *array[] = {"fdgsa", "skaie"};
    

    verändern wollte ich die nur

    von 
    {"ars", "rsa"}
    zu 
    {"dsa", "gfh"}
    die länge ist zwar am anfang variabel, 
    nur verändert sie sich später nicht mehr.
    

    die länge zu ermitteln brauch ich nicht die gibt der user selbst an



  • Nimm malloc und realloc.



  • ich hatte malloc schon probiert wenn ich aber später

    char **array;
    array[5][4] = 'h';
    oder
    printf("%s %c", array[3], array[3][4]);
    

    probiert hatte ist das programm immer abgestürzt
    natürlich habe ich in das array noch werte eingefügt



  • kytero schrieb:

    char **array;
    array[5][4] = 'h';
    

    Das kann so nicht funktionieren. Entweder du reservierst dynamischen Speicher für array mit malloc (dann ist array ein Zeiger) oder du definierst array als Array, dann ist array ein Array.
    Bemühe dich mal, qualifizierte Fragen zu stellen und insbesondere die hier genannten Tipps für Neulinge zu beachten, bisher waren deine Fragen Rumgestochere im Nebel und schwer zu beantworten.



  • ich habe den speicher vorher mit malloc reserviert gehabt, nur hat es trotzdem nicht geklappt und wie soll ich es bitteschön als array definieren wenn ich nicht weis wie groß es ist, so etwas geht ja nicht

    char *array[atoi(argv[1])];
    

    oder muss ich wenn ich speicher reserviere irgendetwas beachten, ich hatte jetzt wenn es 5 strings mit jeweils 5 zeichen waren, 25 byte reserviert.



  • +5 byte



  • dürfte ich fragen wieso, wegen pointer oder muss am ende ein '\0' sein welches ich dann vergessen hätte.



  • Da du offensichtlich nicht Willens oder in der Lage bist, dein Problem qualifiziert zu schildern, damit du qualifizierte Antworten erhälst, die dir weiterhelfen, hier nochmal explizit ein Teil aus den Neulingshinweisen, die du nicht gelesen/beachtet hast:

    Wenn du Code postest, dann bitte nur ein kleines darstellendes Programm, welches man sofort und ohne Umwege kompilieren kann. An dieser kleinen Demo soll dein Problem klar dargestellt sein. Die Demo darf keinen Code enthalten, der nicht am Problem beteiligt ist (abgesehen von allem, was zu einem kompilierbaren Programm gehoert).

    kytero schrieb:

    char **array;
    array[5][4] = 'h';
    

    Ist eindeutig sinnfrei für eine hilfreiche Antwort, da du erst später damit herausrückst, dass du mit malloc gearbeitet hast.



  • ich hatte zwar schon in dem post erwähnt das ich malloc bereits ausprobiert habe,
    aber es mag auch daran liegen das manche sachen nicht sofort klar waren,
    da ich öfter im chats schreibe und nicht immer alles aufeinmal sage,
    dass sehe ich ein und ich war so sparsam mit code da ich noch sehr weit am anfang stehe bei dem Projekt.
    So sieht es bisher aus (das was hier jetzt wichtig ist):

    char **a;
    char *b[] = {"asd", "dsa", "asd"};
    
    a = malloc(9); //oder müssen das 12 sein?
    
    a = b //klappt das theoretisch? oder muss ich strcpy nehmen habe ich beides 
          //schon versucht auch jeden string einzeln zu kopieren
    
    printf("%s", a[1]); // das klappt jedenfalls nicht
    


  • Es müsste ungefähr so gehen (ungetestet):

    char **a;
    char *b[] = {"asd", "dsa", "asd"};
    
    a = malloc(3 * sizeof(char*));
    
    a[0] = malloc(4);
    a[1] = malloc(4);
    a[2] = malloc(4);
    
    strcpy(a[0], b[0]);
    strcpy(a[1], b[1]);
    strcpy(a[2], b[2]);
    
    printf("%s", a[0]);
    printf("%s", a[1]);
    printf("%s", a[2]);
    

    Schleifen kannst Du (hoffentlich) selbst bauen ...



  • ja das kann ich, mir war und ist es teilweise noch nicht ganz klar warum ich zwei mal malloc() benutzen muss und warum "malloc(4)", denn ich kann bei mir dafür einsetzen was ich will, es klappt trotzdem außer ich lasse es weg 😕 .

    ich bin einfach noch nicht so fit in Pointer und erst recht habe ich bisher wenig mit malloc gearbeitet,
    jedenfalls nicht so wie hier^^



  • kytero schrieb:

    ja das kann ich, mir war und ist es teilweise noch nicht ganz klar warum ich zwei mal malloc() benutzen muss und warum "malloc(4)"

    char **zeiger;

    ist erst mal ein Zeiger auf einen Zeiger, deshalb zweimal *.
    mit dem ersten malloc wird Speicher für drei char - Zeiger besorgt, Du hast dann praktisch so etwas wie ein Array aus drei char-Zeigern.
    Damit diese nun auf gültigen Speicher zeigen, wird für jeden dieser Zeiger noch mal Speicher besorgt, 4 Byte jeweils, weil Deine Strings aus drei chars zuzüglich abschließendem NullByte bestehen ...



  • ok dann habe ich das verstanden danke,
    werd mich dann demnächst auch mehr bemühen alle fragen gleich von anfang an zu beantworten



  • Ich habe nach wie vor nicht verstanden, was du eigentlich erreichen willst, aber

    char *b[] = {"asd", "dsa", "asd"};
    char *a[] = {b[0], b[1], b[2]};
    

    funktioniert natürlich ebenso und hat den Vorteil, ohne malloc auszukommen, d.h. auch ohne free.



  • sowas hätte ich auch wohl gerne gemacht ich wusste aber ja nur nicht wie viele strings in dem array sein werden und wie lang diese sind


Anmelden zum Antworten