Правильный способ подстроки char * без утечки памяти - PullRequest
0 голосов
/ 14 января 2020

Я разрабатываю программу для среды arduino, в частности, esp8266, и мне нужно подставить часть полученной команды и преобразовать ее в длинную

Пример:

Полученная команда: "HCHP 000527707 /"

Вывод: 527707

Я создал / вдохновил себя на функцию подстроки, которая работает, но каждый раз при запуске запускает кучу кучи, добавляет до ~ 152 байт для полного кадра, который я получил.

char *substr(char *src,int pos,int len) { 
  char *dest=NULL;                        
  if (len>0) {                         
    char* dest = (char*)calloc(len+1, 1);      
    if(NULL != dest) { 
      strncat(dest,src+pos,len);            
    }
  }                                       
  return dest; 
}

Единственное решение, которое я смог найти после большой отладки, - это и Я знаю, что это плохо и не должно не может быть использовано, как это , но это работает, и нет утечки.

char *substr(char *src,int pos,int len) { 
  char test[len+1] ;
  String(src).substring(pos, pos+len).toCharArray(test,len+1)    ;   
  return test;    
}

В любом случае, кто-то может сказать мне, что я сделал неправильно в первой функции.

А как я могу поставить free(), когда возвращаюсь dest Не знаю, куда его поставить.

1 Ответ

0 голосов
/ 14 января 2020

И как я могу поставить free (), когда я возвращаю dest, я не знаю, куда его поставить.

Ваша (первая версия) функция substr выделяет память и возвращает указатель на него - так что единственный способ освободить эту память - внутри вызывающей функции этой substr. Ie, любую функцию, которая вызывает substr, нужно запомнить, чтобы освободить указатель, возвращаемый ей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...