Гибкий массив указателей на char в структуре - PullRequest
1 голос
/ 15 сентября 2010

Я пытаюсь реализовать кольцевой буфер со следующей структурой

/*head, tail are indexes of the head and tail of ring buffer
 *count is the number of elements; size is the max size of buffer
 *rbArray is an array to pointer of char used to store strings    
 */
struct rb{
  int head;
  int tail;
  int count;
  int size;
  char *rbArray[];
};

Затем я использую следующую функцию для создания строкового буфера:

 struct rb *create(int n){
     /*allocate memory for struct*/
     struct rb *newRb = (struct rb*)malloc(sizeof(struct rb)+ n*sizeof(char *));
     assert(newRb);

     int i;
     for(i=0;i<n;i++)
        newRb->rbArray[i] = NULL;

     /*put head and tail at the beginning of array
     initialize count, set max number of elements*/
     newRb->head = 0;
     newRb->tail = 0;
     newRb->count = 0;
     newRb->size = n;

     return newRb;
   }

Я вызываю эту функцию в основном:

 struct rb *newRB = (struct rb*)create(100);

Тем не менее, у меня проблема прямо на этапе выделения памяти для структуры. В режиме отладки я вижу, что значению head, tail, count были назначены очень странные большие числа, но не 0. И программа зависает после этого самого первого шага, не выдавая мне никаких исключений.

Может кто-нибудь помочь мне объяснить эту проблему, пожалуйста? Как я могу это исправить?

Ответы [ 3 ]

3 голосов
/ 15 сентября 2010

Мне тяжело читать ваш код, но из того, что я понял, вы, вероятно, захотите сделать что-то вроде:

struct rb *create(int n)
{
    struct rb newRb = calloc(1, sizeof(struct rb));
    newRb->rbArray = calloc(n, sizeof(char*));

    newRb->count = n;

    return newRb;
}

calloc удостоверится, что содержимое выделенного пространства установленов ноль.Кроме того, просто выделение дополнительного n*sizeof(char*) при первом вызове malloc кажется подозрительным.

0 голосов
/ 15 сентября 2010

Спасибо, ребята, за помощь.Я сделал так, чтобы он работал с char **, и это определенно намного проще, чем работа с гибким членом массива.

Однако, мне интересно, когда у вас есть массив ** **;Вы можете использовать массив [i], и он даст вам указатель на символ.Почему, если у нас есть char * array;мы не можем использовать массив [i], чтобы получить символ?

Надеюсь, я проясню здесь достаточно.

Спасибо

0 голосов
/ 15 сентября 2010

Ниже должен быть более короткий способ сделать то же самое:

struct rb *create(int n)
{
    struct rb * newRb = calloc(sizeof(struct rb) + n*sizeof(char*), 1);
    newRb->size = n;    
    return newRb;
}

Устанавливает все выделенное пространство на 0, а затем правильно устанавливает поле size.

...