sizeof () zeigt alloziierten Speicher nicht an!?



  • mach das Allokierungsfunktionen!!!

    struct YourString
    {
    char* string;
    int len;
    }
    
    struct YourString AllocStrMem(char* scr)
    {
      struct YourStruct tmp;
    
    tmp.len = strlen(scr);
    tmp.string=malloc (tmp.len+1);
    tmp.string[tmp.len]= '\x0';
    tmp.len = strlen(scr);
    
    return tmp;
    }
    

    SO irgendwie........



  • mach das Allokierungsfunktionen!!!

    Dann mach aber auch eine free Funktion...



  • Korrekt Theta:

    void FreeStrMem(struct YourString scr)
    {
     if(scr !=null && scr.string!=null)
        free(scr.string);
      scr.len=0;
    
     }
    

    hier chef...



  • 1. Statt:

    Jihhaaa schrieb:

    tmp.string[tmp.len]= '\x0';
    

    das hier:

    strcpy(tmp.string, scr);
    

    2. muss natürlich trotzdem irgendwo bereits allokierter Speicher vorhanden sein, der scr beherbergt.



  • stimmt hab vergessen den string zu kopieren.. aber immerhin Null terminiert^^



  • Gibts das Wort überhaupt heist es nich einfach Allokieren???

    Also ich habe im Duden nachgeschaut: Das Wort allozieren gibt es wirklich, aber natürlich mit nur einem 'i'. Es heist übersetzt "belegen,reservieren";
    Das Wort allokieren gibt es aber auch und heist eher "ansprechen";
    Hier ist es auch ganz gut erklärt: http://faql.de/fremdwort.html

    Jihhhaaa, danke für deine Funktionen, aber damit hast du doch im Prinzip die normalen Funktionen "nur" anders verpackt und das löst das Problem ohne Zwischenspeicher an ein dynamisch angepasstes Array zu kommen eher nicht. Ich könnte ja eigentlich mit den original Stringfunktionen arbeiten.

    Also kann man nicht um ein Zwischenspeichern rum kommen!????



  • Ja, allozieren und allokieren werden beide in dem Kontext verwendet. Kommt immer auf's Buch oder den Gesprächspartner an...

    EDIT: Zum Thema Zwischenspeicher-String. Du könntest natürlich zeichenweise einlesen und dein dynamisches Array schrittweise reallozieren (z.B. immer in 10er-Schritten vergrößern). Umständlich, aber so stellst du sicher, dass nicht zuviel Platz verschwendet wird, aber auch nicht zu wenig bereitgestellt wird. Was passiert denn beispielsweise bei deiner Variante, wenn der User mehr als 99 Zeichen eingibt?



  • Balu Jr. schrieb:

    Also kann man nicht um ein Zwischenspeichern rum kommen!????

    Doch, man kann, guckst du hier:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-242705-and-start-is-10.html

    Auf Minimalsystemen kann BUFSIZ zu groß werden und ein malloc versagt.

    Meiner Meinung nach wird um das zeichenweise reallozieren zu viel Wirbel gemacht. Handelt es sich um eine Benutzereingabe, so macht der Prozessor auch bei einem realloc pro Zeichen die meiste Zeit über nix anderes als Nix, er wartet also auf die Eingabe.

    Guckst du hier für dynamischen String ohne BUFSIZ und ohne Zwischenpuffer:

    char* coninput2()
    {
    	int c = 0, i = 1;
    	char* s = NULL, *t = NULL;
    
    	while ( (c = fgetc(stdin)) != '\n' && c != EOF )
    	{
    		if( NULL == (t = realloc(s, i+1)))
    			break;
    		s = t;
    		s[i-1] = c;
    		s[i++] = 0;
    	}
    	return s;
    }
    

    Für gewöhnliche PC Programme mit ausreichend Arbeitsspeicher würde ich aber die Mr. C Variante nehmen.
    Gruß,
    B.B.



  • Was passiert denn beispielsweise bei deiner Variante, wenn der User mehr als 99 Zeichen eingibt?

    ICh weiss Matze. Dann gibts nen schönen Bufferoverflow. Aber desshalb habe mache ich ja auch hier gefragt. Das meine ich mit dem statischen Array. Das müsste ja sonst unendlich groß sein und das ist/war eben mein Problem.

    Doch, man kann, guckst du hier:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-242705-and-start-is-10.html

    Danke für den Hinweis, aber guck mal wer da auch seine Finger schon mit im Spiel hat.... ich.
    Da das ein ähnliches Problem ist, hab ich da auch gepostet!



  • Big Brother schrieb:

    Meiner Meinung nach wird um das zeichenweise reallozieren zu viel Wirbel gemacht. Handelt es sich um eine Benutzereingabe, so macht der Prozessor auch bei einem realloc pro Zeichen die meiste Zeit über nix anderes als Nix, er wartet also auf die Eingabe.

    bei benutzereingaben u.ä. langsamen datenquellen (und wenn die CPU sonst nix zu tun hat) mag es egal sein. aber bedenke, dass du nach der methode 'pro byte' übelst viel rechenzeit verballerst. erst recht, wenn realloc mal seine listen umsortiert.
    🙂


Anmelden zum Antworten