Mark: C Array Größe bestimmen

Hallo, habe folgenden Programmcode:

/*Global definiert*/  
char *ein={'\0'};  
  
int read()  
{  
   ein= (char*) realloc(ein, 257);  
   printf("%i", sizeof(ein));  
}

Leider funktioniert das Ausgeben der Arraygröße nicht. Ich glaube es liegt an dem Pointer, kann mir da jemand behilflich sein?

  1. Hallo Mark,

    /Global definiert/

    ein= (char*) realloc(ein, 257);
       printf("%i", sizeof(ein));

      
    
    > Leider funktioniert das Ausgeben der Arraygröße nicht. Ich glaube es liegt an dem Pointer  
      
    korrekt, "ein" ist ein Pointer auf einen Charakter, und mit sizeof() erhältst du dessen Größe.  
      
    
    > kann mir da jemand behilflich sein?  
      
    Das ist das schöne an C ;-)  
    Du darfst (böse Zungen behaupten "musst") dich um alles selbst kümmern.  
    Aber die Größe legst du doch beim realloc fest, also ist sie dir ja bekannt. Im Zweifelsfalle musst du diese Information eben mitführen.  
      
    Größe,  
      
    Jochen  
    
    -- 
    ![](http://www.electric-lemon.de/scribble/pics/tn_picV1_016.png) Kritzeln statt texten: [Scribbleboard](http://www.electric-lemon.de/scribbleboard.php)
    
    1. Das ist das schöne an C ;-)
      Du darfst (böse Zungen behaupten "musst") dich um alles selbst kümmern.
      Aber die Größe legst du doch beim realloc fest, also ist sie dir ja bekannt. Im Zweifelsfalle musst du diese Information eben mitführen.

      Das Mitführen wollte ich eigentlich umgehen. Das Erweitern des Arrays soll irgendwann mal dynamisch erfolgen und ich brauche nur in bestimmten Fällen die Größe. Kann man denn da gar nichts machen?

      1. Hi Mark,

        Das Mitführen wollte ich eigentlich umgehen. Das Erweitern des Arrays soll irgendwann mal dynamisch erfolgen und ich brauche nur in bestimmten Fällen die Größe. Kann man denn da gar nichts machen?

        nicht mit C. Für "bequeme" Programmierer gibts dann C++ oder Java.
        Aber sei gewarnt ... das ist wie die dunkle Seite der Macht. Schneller, verführerischer, aber gewiss nicht mächtiger. :)

        Grüße,

        Jochen

        --
        Kritzeln statt texten: Scribbleboard
      2. Hallo,

        »» Das ist das schöne an C ;-)
        »» Du darfst (böse Zungen behaupten "musst") dich um alles selbst kümmern.

        ja, das gefällt mir daran auch.

        Das Erweitern des Arrays soll irgendwann mal dynamisch erfolgen und ich brauche nur in bestimmten Fällen die Größe. Kann man denn da gar nichts machen?

        Doch: Eine Struktur definieren, die einen Zeiger und die Größe des damit referenzierten Speicherblocks enthält, und einen Wrapper für malloc(), realloc() und free() schreiben.

        typedef struct  
         { unsigned size;  
           void*    addr;  
         } MEMDESCR;  
          
        void* my_malloc(MEMDESCR* m, int s)  
         { if (m!)                          // make sure m is not a NULL pointer  
              return (NULL);                // if so, decline gracefully  
          
           m->addr = malloc(s);             // allocate memory  
           m->size = (m->addr ? s : 0);     // in case of success, store size  
           return (m->addr);  
         }  
          
        void* my_realloc(MEMDESCR* m, int s)  
         { if (m!)                          // make sure m is not a NULL pointer  
              return (NULL);                // same as above  
          
           m->addr = realloc(m->addr, s);   // re-allocate memory  
           m->size = (m->addr ? s : 0);     // in case of success, store size  
           return (m->addr);  
         }  
          
        void my_free(MEMDESCR* m)  
         { if (m!)                          // the usual check again  
              return (NULL);                //  
          
           free(m->addr);                   // release memory  
           m->size = 0;                     // and note that in m  
         }
        

        Und nun kannst du eine MEMDESCR-Struktur als Ersatz für einen einfachen Pointer nehmen, die die Größe des referenzierten Speicherblocks quasi "von allein" immer mitführt[1].
        Das Konzept ist vielleicht noch nicht perfekt, nur so'ne schnell hingetippte Idee. Aber in der Art würde ich es machen.

        So long,
         Martin

        [1] Das ist übrigens auch das Schöne, wenn man plattformabhängig sein darf: Benutzt man statt malloc() und free() direkt die Windows-Speicherverwaltung (z.B. API-Funktionen GlobalAlloc() und GlobalFree()), kann man jederzeit die Größe der zugeteilten Speicherblöcke abfragen.

        --
        Man soll den Tag nicht vor dem Abend loben.
        Und den Mann nicht vor dem Morgen.
          (alte Volksweisheit)
        1. Und nun kannst du eine MEMDESCR-Struktur als Ersatz für einen einfachen Pointer nehmen, die die Größe des referenzierten Speicherblocks quasi "von allein" immer mitführt[1].
          Das Konzept ist vielleicht noch nicht perfekt, nur so'ne schnell hingetippte Idee. Aber in der Art würde ich es machen.

          So long,
          Martin

          Vielen Dank.

        2. Hi,

          ich weiß ja nicht ... hab ich vorhin noch geschlafen, oder was war los?
          Bevor da irgendwelche Klagen kommen, möchte ich die offensichtlichsten Fehler mal schnell selbst richtigstellen.

          void* my_malloc(MEMDESCR* m, int s)
          { if (m!)                          // make sure m is not a NULL pointer

          Das muss natürlich heißen:  if (!m)
          Ebenso in my_realloc() und my_free(). Copy&Paste ist eine herrliche Möglichkeit, Fehler zu vervielfältigen. ;-)

          void my_free(MEMDESCR* m)
          { if (m!)                          // the usual check again
                return (NULL);                //

          Und hier kommt noch dazu, dass die Funktion void deklariert ist und keinen Wert zurückgeben soll.

          Ciao,
           Martin

          --
          Es gibt Dinge, die sind sooo falsch, dass nicht einmal das Gegenteil stimmt.
          1. Hi,

            ich weiß ja nicht ... hab ich vorhin noch geschlafen, oder was war los?
            Bevor da irgendwelche Klagen kommen, möchte ich die offensichtlichsten Fehler mal schnell selbst richtigstellen.

            Hi,

            das macht nichts. Ich weiß aber auf was du hinaus wolltest ;-)

  2. Hello,

    /Global definiert/

    char *ein={'\0'};

    int read()
    {
       ein= (char*) realloc(ein, 257);
       printf("%i", sizeof(ein));
    }

    
    >   
    > Leider funktioniert das Ausgeben der Arraygröße nicht. Ich glaube es liegt an dem Pointer, kann mir da jemand behilflich sein?  
      
    Was bekommst Du denn als Ausgabe? Vielleicht 4?  
      
    Willst Du die Größe vom Pointer wissen oder vom Bereich, auf den er zeigt?  
      
      
      
    Liebe Grüße aus dem schönen Oberharz  
      
      
    Tom vom Berg  
    ![](http://selfhtml.bitworks.de/Virencheck.gif)  
      
    
    -- 
    Nur selber lernen macht schlau  
    <http://bergpost.annerschbarrich.de>
    
    1. Was bekommst Du denn als Ausgabe? Vielleicht 4?

      Jep, ich bekomme 4 raus, also die Größe vom Pointer.

      Willst Du die Größe vom Pointer wissen oder vom Bereich, auf den er zeigt?

      Natürlich vom kompletten Array, z.B. soll mir in dem Fall 257 ausgeben werden.