Dynamisches Array in C



  • Hi!

    Ich will in einer Anwendung ein Wort einlesen und das Wort dann in ein char-Array speichern. Das Array soll immer so viele Felder haben wie das Wort Buchstaben hat. Wie mach ich das am besten?



  • hi!
    du kannst mit malloc dynamische arrays erzeugen.



  • Was für ein Schwachsinn ist das denn?
    Mit malloc kannst du keine Dynamischen felder erzeugen, du kannst nur Speicher reservieren und zwar irgendwo im code, und du kannst mit realloc -glaube ich- auch neuen dazu packen, aber das ist inperformant...

    Orothred: warum willst du einen array der z.B. 7 Zeichen lang ist. mach ihn gleich auf 50, 100 oder 128 länger wird kein Wort sein.

    Ansonsten kannst du auch mit einer einfach- oder zweifach verketteten Liste arbeiten, Da kannst du unendlich viel einlesen, naja soviel wie dein Speicher hergibt 😃



  • Könntest du so machen:

    typedef struct 
    {
      size_t len;
      char *data;
    
    } Arr;
    
    void InitArr(Arr *a)
    {
      a->len = 0;
      a->data = NULL;
    }
    
    void SetArr(Arr *a, const char *str)
    {
      a->len = strlen(str);
      a->data = realloc(a->data, a->len + 1);
      strcpy(a->data, str);
    }
    
    void DestroyArr(Arr *a)
    {
      free(a->data);
    }
    


  • Relloc is scheiße, grund hierfür ist:
    Es wird neuer speicher allociert mit der geforderten größe, dann wird dein alter speicher dahin KOPIERT*(hier suckts dann)* und ja...

    Es geht aber bei 500MB willst du keinen realloc machen, weils ewig dauert.

    Verkettete liste is viel geiler. Ok du hast nichts was exakt so lang ist wie dus brauchst, aber +/- 50 Zeichen ist doch auch kein problem.



  • lippoliv schrieb:

    Mit malloc kannst du keine Dynamischen felder erzeugen

    Wie wäre denn Dein Vorschlag zur Benennung eines dynamisch alloziierten, zusammenhängenden Speicherbereichs??

    lippoliv schrieb:

    und du kannst mit realloc -glaube ich- auch neuen dazu packen, aber das ist inperformant...

    Binsenweisheit 🙄

    lippoliv schrieb:

    [...] länger wird kein Wort sein.

    Das ist wohl der Stoff, aus dem Buffer Overflows gemacht sind...

    lippoliv schrieb:

    Relloc is scheiße, grund hierfür ist:
    Es wird neuer speicher allociert mit der geforderten größe, dann wird dein alter speicher dahin KOPIERT(hier suckts dann) und ja...

    realloc versucht, wenn möglich, den Speicherbereich an Ort und Stelle zu vergrößern. Nur im Falle das dies fehlschlägt, wird kopiert...

    lippoliv schrieb:

    Es geht aber bei 500MB willst du keinen realloc machen, weils ewig dauert.

    so lange ist mit Sicherheit kein Wort.

    lippoliv schrieb:

    Verkettete liste is viel geiler. Ok du hast nichts was exakt so lang ist wie dus brauchst, aber +/- 50 Zeichen ist doch auch kein problem.

    Ich halt's für overkill...

    @Orothred: Solltest du an dieser Stelle Performanceprobleme feststellen, so meld' Dich beim Guinnes Buch: Schnelltipprekord 😃

    Das größere Problem wird sein, einen einzelnen Tastendruck zu bekommen, damit du den benötigten Speicherbedarf anpassen kannst. Mit reinem Standard C schaut's da schlecht aus...

    unter Windows:

    #include <stdlib.h>
    #include <stdio.h>
    #include <ctype.h>
    
    #include <conio.h>
    
    char* read_input( ) {
    
    	size_t length = 1;
    	int ch;
    	char *temp = 0, *input = calloc( 1, 1 );
    
    	if( !input ) {
    
    		return 0;
    	}
    
    	do {
    
    		ch = _getch( );
    
    		if( isprint( ch ) ) {
    
    			temp = realloc( input, length + 1 );
    
    			if( !temp ) {
    
    				free( input );
    				return 0;
    			}
    
    			_putch( ch );
    
    			input = temp;
    
    			input[ length - 1 ] = ch;
    			input[ length ] = 0;
    			++length;
    		}
    
    	} while( ch != '\r' );
    
    	_putch( '\n' );
    	return input;
    }
    
    int main( ) {
    
    	char *input = read_input( );
    
    	puts( input );
    
    	free( input );
    }
    

    greetz, Swordfish

    PS: Mit dem erweiterten ASCII Codes hat die Funktion unter Umständen Probleme.



  • fakt is halt einfach das ich die buchstabenanzahl das wortes fürs weitere programm brauche.

    vielleicht kann ich das ja auch anders lösen als mit nem array, das sich an die länge des wortes anpasst, aber das array war das erste, was mir eingefallen ist



  • Ähm, strlen( ) ?

    greetz, Swordfish



  • lippoliv schrieb:

    Was für ein Schwachsinn ist das denn?
    Mit malloc kannst du keine Dynamischen felder erzeugen, du kannst nur Speicher reservieren und zwar irgendwo im code, und du kannst mit realloc -glaube ich- auch neuen dazu packen, aber das ist inperformant...

    natürlich kann man dynamisch arrays bzw. felder erzeugen und diese mit einem index ansprechen.
    du wirst doch wohl nicht ernsthaft behautpen wollen, das es bei einer manuellen eingabe von zeichen auf performance ankommt ?
    ausserdem versucht realloc zuerst den vorhandenen speicherblock zu vergrößern. dabei brauchen nur die zeiger kopiert zu werden und nicht der komplette speicherbereich. nur im falle, das nicht vergrößert werden kann wird an einer anderen stelle im speicher ein neuer block erzeugt und kopiert.

    eine verkettete liste für die eingabe von zeichen zu schreiben ist doch wohl nicht dein ernst oder ?
    🤡 😃 🤡 *trööööööööööt*

    Orothred schrieb:

    fakt is halt einfach das ich die buchstabenanzahl das wortes fürs weitere programm brauche.

    vielleicht kann ich das ja auch anders lösen als mit nem array, das sich an die länge des wortes anpasst, aber das array war das erste, was mir eingefallen ist

    was für eine buchstabenanzahl erwartest du ?
    du kannst einen puffer bestimmter länge vorbereiten und wenn dieser bei der eingabe nicht ausreicht, kannst du dynamisch ein größeres array erzeugen und den 'überschuss' anhängen.



  • agga ugga schrieb:

    natürlich kann man dynamisch arrays bzw. felder erzeugen und diese mit einem index ansprechen.

    Gut ich habe mich mit Dynamisch auf die größe bezogen, also die Länge des Array, also z.B. 0-50... Um den auf 51 Zellen zu erweitern -so dachte ich- wird ein neuer Bereich reserviert mit 0-51, und desswegen fand ichs schwachsinn...

    Klar bei einem Wort ist das wahrscheinlich kein Problem, aber ich habe damals (wo ich sowas benutzen wollte) mit einlesen einer Datei hantiert, desswegen ging das halt nicht.
    Da hat die Verkettete Liste geholfen.


Anmelden zum Antworten