2015-06-26 3 views
-1

Я написал простой код C, который должен хранить список строковых адресов (char *) внутри структуры. Список динамический, поэтому каждый раз, когда добавляется новая строка, я оставляю достаточно памяти для хранения всех текущих строковых адресов и нового. Затем я освобождаю старый буфер и назначаю новую структуру. Проблема в том, что он падает на free().Динамический список строк и бесплатное() сбойное приложение

Я уверен, что я свободен() с точным адресом, который я получил от calloc(), но все же он сработает.

здесь выход:

основной (3618,0x7fff7a83f300) таНос: *** ошибки для объекта 0x7f9902404bd0: неправильная контрольная сумма освобожденного объекта - объект, вероятно, был изменен после освобождения.

Код:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

typedef struct StructNODE{ 
    char** stringlist; 
    int stringcount; 
    struct StructNODE* next; 
} NODE; 


void Addstring(NODE* node, const char* string) 
{ 
    int currentBufferSize = node->stringcount * sizeof(char*); 

    // make room for the current string list plus the new one 
    char** addrList = (char**) calloc(1, currentBufferSize); 
    printf("malloc: %d bytes starting at 0x%X\n",currentBufferSize, addrList); 

    // copy all current addresses to the new list 
    memcpy(addrList, node->stringlist, currentBufferSize); 

    printf("freeing mem at 0x%X\n",node->stringlist); 
    free(node->stringlist); 

    // Append the new address to the end of the address buffer 
    addrList[node->stringcount] = (char*)string; 

    //make the node point to the new buffer 
    node->stringlist = addrList; 

    // Increment the string number counter 
    node->stringcount++; 

} 

void PrintStringlist(NODE* node) 
{ 
    int i; 
    for (i=0; i < node->stringcount; i++) 
    { 
     printf("string %d: %s\n",i, node->stringlist[i]); 
    } 
} 

int main(int argc, char** argv) 
{ 
    NODE* node = (NODE*) calloc(1 , sizeof(NODE)); 

    Addstring(node, "Lewis Skolnick"); 
    Addstring(node, "Gilbert Lowe");  
    Addstring(node, "Arnold Poindexter");  
    Addstring(node, "Harold Wormser"); 
    Addstring(node, "Booger"); 
    Addstring(node, "Takashi Toshiro"); 
    Addstring(node, "Lamar Latrelle"); 
    Addstring(node, "Judy");  

    PrintStringlist(node); 

    return 0; 
} 

Что я с видом?

ответ

0

Ваш буфер слишком мал - вы забыли добавить место для дополнительного элемента. Функция кулака строка должна гласить:

int currentBufferSize = (node->stringcount + 1) * sizeof(char*); 
+0

Спасибо. Это была проблема! Я добавил дополнительный размер для вызова calloc(): char ** addrList = (char **) calloc (1, currentBufferSize + sizeof (char *)); – marciovmf

0

подпись calloc является следующее:

void* calloc (size_t num, size_t size); 

Таким образом, если предположить stringcount является фактическая сумма, вы должны вызвать его с различными аргументами, например

calloc(sizeof(char*), node->stringcount +1) 

В любом случае есть еще одна полезная функция в stdlib, которая равна realloc, это позволяет изменять размер выделенного меморандума y без необходимости копировать все данные самостоятельно или освобождать предыдущую память:

node->stringList = realloc(node->stringList, (node->stringcount+1)*sizeof(char*)); 
node->stringList[node->stringcount] = (char*)string; 
Смежные вопросы