Dynamisches Array



  • Hallo, ich habe mal was mit malloc gemacht. Es soll ein dynamisches Array sein, daß sich bei bedarf vergrößern kann. Ich habe kaum Erfahrung mit der Speicherverwaltung. Ist der Code so weit korrekt?

    #ifndef BUCKET_H
    #define BUCKET_H
    
    typedef struct __BUCKET
    {
      char *mem;
      size_t size;
      size_t count;
    } BUCKET;
    
    int BucketCreate (BUCKET *b);
    int BucketPut (BUCKET *b, char *from, size_t len);
    char *BucketGetPointer (BUCKET *b, size_t *count);
    void BucketDestroy (BUCKET *b);
    
    #endif // BUCKET_H
    
    #include <stdlib.h>
    #include <string.h>
    #include "bucket.h"
    
    int BucketCreate (BUCKET *b)
    {
      b->mem = malloc (256);
      if (b->mem == 0)
        return -1;
      b->size = 256;
      b->count = 0;
      return 0;
    }
    
    int BucketPut (BUCKET *b, char *from, size_t len)
    {
      while ((b->count + len) > b->size)
      {
        char *tmp;
        b->size *= 2;
        tmp = realloc (b->mem, b->size);
        if (tmp == 0)
        {
          b->size /= 2;
          return -1;
        }
        b->mem = tmp;
      }
      memcpy (b->mem + b->count, from, len);
      b->count += len;
      return 0;
    }
    
    char *BucketGetPointer (BUCKET *b, size_t *count)
    {
      *count = b->count;
      return b->mem;
    }
    
    void BucketDestroy (BUCKET *b)
    {
      free (b->mem);
      b->count = 0;
      b->size = 0;
    }
    

    Vielen Dank an euch. :schland:



  • sieht auf den ersten blick gut aus. fast schon objektorientiert, hehe. diese verdopplungsmethode ist nur manchmal etwas ungünstig.
    🙂



  • ^^edit: bei BucketDestroy würde ich b->size nicht auf 0, sondern wieder auf den startwert setzen. dann kannste den 'eimer' wiederverwenden, ohne 'create' aufzurufen.
    🙂



  • ^^edit2: ...und b->mem auf 0 setzen.
    🙂


Log in to reply