理解使用malloc重新分配的困难

时间:2015-04-26 00:49:44

标签: c memory-leaks malloc runtime-error

我正在尝试使用collection而不是malloc来增加realloc结构的大小。我担心在分配变量时我犯了错误,因为我得到了:

malloc: *** error for object 0x7fd46b404ac8: pointer being freed was not allocated

如果你能给我一个有用的暗示,我真的很感激。

void increaseCollectionSize(){
  collection.size = (collection.size + 1) * REALLOCATE_MODIFIER;
  char **increasedCollection = malloc(sizeof(char *) * collection.size);
  char **increasedHead = increasedCollection;
  for(int i = 0; i < collection.numberOfWords; i++){
    *increasedCollection = *collection.words;
    increasedCollection++;
    collection.words++;
  }
  free(collection.words); // I'm getting error here.
  collection.words = increasedHead;
}

typedef struct Collection{
  char **words;
  size_t numberOfWords;
  size_t size;
} Collection;

1 个答案:

答案 0 :(得分:1)

释放collection.words的最终值,这是指向原始内存块结尾的指针(由于循环中的++)。

void increaseCollectionSize(){
    collection.size = (collection.size + 1) * REALLOCATE_MODIFIER;
    char **increasedCollection = malloc(sizeof(char *) * collection.size);
    char **increasedHead = increasedCollection;
    char **originalWords = collection.words; // save a pointer
    for(int i = 0; i < collection.numberOfWords; i++){
        *increasedCollection = *collection.words;
        increasedCollection++;
        collection.words++;
    }
    free(originalWords); // now ok
    collection.words = increasedHead;
}

或者,降低复杂性:

void increaseCollectionSize() {
    collection.size = (collection.size + 1) * REALLOCATE_MODIFIER;
    char **increasedCollection = malloc(sizeof(char *) * collection.size);
    assert(increasedCollection != NULL); // explicitly abort() on malloc() error

    for (size_t i = 0; i < collection.numberOfWords; i++)
        increasedCollection[i] = collection.words[i];

    free(collection.words);
    collection.words = increasedCollection;
}