У вас фактически нет утечки памяти (в коде, который вы выложили в любом случае), но вы делаете несколько вещей неправильно.
char* test = "\0";
Это объявляет указатель с именем test и инициализирует его, чтобы указывать на некоторый буквенный массив из двух байтов {0, 0}
test = strcat(test, somestr);
Это пытается что-то добавить к концу этого строкового литерала (и, поскольку строка C пуста, она будет похожа на строковую копию). Литеральные значения часто хранятся в памяти, которая недоступна для записи, поэтому копирование чего-либо в эту память может вызвать ошибку (ошибка сегментации или SIGSEGV во многих операционных системах). Кроме того, у вас есть только два байта памяти, на которые указывает test , что означает, что если somestr не ссылается на строку, чья strlen меньше или равна 1, то вы в конечном итоге попытается перезаписать какую-то другую память (что будет после «\ 0», на которое указывает test ).
char* tmp = strstr(test, 0, len);
Я не знаю, что здесь происходит, поскольку strstr принимает только 2 аргумента (оба const char *
).
free(test);
Здесь вы пытаетесь освободить память, выделенную без кучи. Куча - это то, где malloc, realloc и calloc получают память, которую они выделяют. Вызов free с областью памяти, которая не была возвращена одной из этих функций (и некоторыми другими функциями в некоторых системах), является ошибкой, поскольку free не знает, что с ними делать .
Вам, вероятно, следует иметь в виду, что часто память представляет собой огромный массив байтов, а используемые вами указатели похожи на индексы массивов. Система, которую вы используете, может различать некоторые области этого массива и определять, как вы можете получить к ним доступ (читаемый, записываемый и / или исполняемый). Но это все еще просто массив байтов. Если у вас есть строка (например, "foo"
), это означает, что где-то в ОЗУ есть четыре байта (3 буквы + байт терминатора \ 0), и вы можете получить доступ к этой области, зная ее индекс в массиве байтов, который является ОЗУ , Скорее всего, рядом с вашей строкой хранятся другие вещи (например, { ..., 4, 2, 'f', 'o', 'o', 0, 99, 3, 2, ...}
), поэтому вы должны убедиться, что вы остаетесь в пространстве этой памяти, не забираясь в смежные данные.