Допустим, есть код:
char * str = malloc(16 * sizeof(char));
strcpy(str, "simple_string");
str = strrem(str, "s_");
Функция strrem
char * strrem(const char * _str, const char * _to_rem)
{
char * out = malloc(strlen(_str) * sizeof(char));
...
return out;
}
Что станет с первоначальным указателем str и указателем out?
Ответ
Давайте взглянем, что происходит с переменной str во время указанных манипуляций:
char * str = malloc(16 * sizeof(char));
/* str
* v
* +---------+
* | 16 байт |
* +---------+
*/
Пока все просто - выделили память под 16 байт.
strcpy(str, "simple_string");
/* str
* v
* +---------+
* | 16 байт | = "simple_string"
* +---------+
*/
На всякий случай, стоит использовать strncpy чтобы не выйти за пределы памяти.
str = strrem(str, "s_");
/* ? str
* v v
* +---------+ +---------+
* | 16 байт | = "simple_string" | 13 байт |
* +---------+ +---------+
*/
После этого шага str указывает на новую область памяти. Если внутри функции strrem не производится очистка памяти по переданному указателю (а это делать не стоит как минимум потому что туда могут передать указатель на область памяти на стеке), то произойдет утечка памяти.
P.S.: Согласно стандарту Си, sizeof(char) всегда возвращает 1
Комментариев нет:
Отправить комментарий