2017-02-02 2 views
2
char **add_string(char **existing, const char *string){ 
    size_t size = 0; 
    while (NULL != existing[size]) 
    { 
     ++size; 
    } 
    char **arr = realloc(existing, (size + 2) * sizeof *arr); 
    arr[size] = malloc(strlen(string) + 1); 
    strcpy(arr[size], string); 
    arr[size+1] = '\0'; 
    return arr; 
} 

void free_strings(char **strings) 
{ 
    size_t size = 0; 
    while (NULL != strings[size]) 
    { 
    free(strings[size]); 
    ++size; 
    } 
} 

Я имею утечку памяти в строкеутечка памяти с массивами строк в C

char **arr = realloc(existing, (size + 2) * sizeof *arr); 

Я думал, что существующая память предполагают, чтобы быть free'd при использовании перераспределить? Как исправить эту утечку памяти?

Редактировать: добавлена ​​функция free_string и основная функция, которую я использую для запуска программы.

+0

Где код, который освобождает массив позже? Инструмент проверки утечки может указывать на место утечки памяти, которое было выделено, но оно не может показать вам, где оно должно быть освобождено ... что, скорее всего, отсутствует. При условии, что 'realloc()' преуспел, он либо предоставит вам тот же блок, либо освободит старый, и выделит новый ... но вам все равно придется освобождать новый (или повторно) один в какой-то момент позже. – Dmitri

+0

Почему вы делаете (размер + 2) вместо (размер + 1)? – odin

+1

@ в том, как он получает размер, не включает конечный указатель NULL ... поэтому он должен добавить 2, 1 для NULL и 1 для новой строки. Хотя он должен установить последний указатель на 'NULL' вместо' '\ 0'' – Dmitri

ответ

1

Вы не добавили массив, на который указывает указатель existing с нулевым указателем. Таким образом, в этом цикле

while (NULL! = Существующий [размер]) { ++ размер; }

Функция имеет неопределенное поведение.

Кажется, вы имеете в виду следующее

char ** add_string(char **existing, const char *string) 
{ 
    size_t size = 0; 

    while (NULL != existing[size]) ++size; 

    char **arr = realloc(existing, (size + 2) * sizeof *arr); 

    if (arr != NULL) 
    { 
     arr[size] = malloc(strlen(string) + 1); 
     strcpy(arr[size], string); 
     arr[size+1] = NULL; 
    } 

    return arr; 
} 

Также функция free_strings неверна. Он должен выглядеть так:

void free_strings(char **strings) 
{ 
    size_t size` = 0; 

    do 
    { 
     free(strings[size]); 
    } while (strings[size++] != NULL); 

    free(strings); 
} 
+0

Мне нужен размер realloc + 2, потому что у меня есть место для arr [size] и arr [size + 1] –

+0

Спасибо, я никогда не освобождал собственно строки. –

+0

@RoomMates Я не вижу, где вам нужно добавить два элемента вместо одного, потому что вы вставляете только одну строку. –

Смежные вопросы