2017-01-16 7 views
0

В настоящее время я использую следующий код, чтобы получить «пониженную» строку:с использованием арифметики указателя для итерации, возможной утечки памяти?

void strlower(char** string) 
{ 
    char* ptr = malloc((strlen(*string)+1) * sizeof **string); 
    memcpy(ptr, *string, (strlen(*string)+1) * sizeof **string); 

    while (*ptr) { 
     if (*(ptr) >= 'A' && *(ptr) <= 'Z') { 
      memset(*string + (strlen(*string) - strlen(ptr)), (char)(*(ptr)+32), sizeof **string); 
     } 
     ++ptr; 
    } 
    memcpy(*string, ptr, (strlen(*string) +1) * sizeof **string); 

    /// free(ptr); THROWS ERROR 
    free(ptr); 
    ptr = NULL; 
} 

Если я пытаюсь free(ptr); я наделенным malloc это бросит мне исключение.

Есть ли утечка памяти? не могу ли я освободить его, потому что он пуст? есть что-то делать с null pointer s? Это неопределенное поведение? хотелось бы узнать!

+0

'размерof ** строка' ... пожалуйста, не наденьте код, как будто, сбив с толку в лучшем случае. –

+1

В чем проблема с 'tolower()' и простой цикл? –

+0

«это сделает меня исключением». - C не поддерживает исключения. – Olaf

ответ

2

С ++ptr; у вас есть lost Указатель вернул malloc(). Если вы не передадите точный указатель, возвращаемый функциями распределителя памяти, free(), вы будете вызывать undefined behavior.

Решение: Необходимо сохранить копию фактического возвращенного указателя где-то, который будет передан позднее free().

+0

получил это :) спасибо! – Lupor

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

  • Нет связанных вопросов^_^