my_calloc()
имеет различные проблемы:
Попытка математического указателя на void *
Это неопределенное поведение (UB).
Вместо этого сделайте ptr
символьный указатель.
// void *ptr = NULL;
unsigned char *ptr = NULL;
...
ptr++;
Попытка отмены ссылки a void *
Это также UB.
Вместо этого сделайте ptr
символьный указатель.
// void *ptr = NULL;
unsigned char *ptr = NULL;
...
// *ptr = NULL;
*ptr = '\0';
my_calloc()
выделяет больше памяти, чем calloc()
Чтобы сделать то же самое, что и calloc()
, не добавляйте его.
// ptr = malloc(n * (size + 1));
ptr = malloc(n * size);
Без защиты от переполнения
my_calloc()
не обнаруживает переполнение с помощью n * (size + 1)
. Тест
// Note: it is known n > 0 at this point
if (SIZE_MAX/n > size+1) return NULL;
// or if OP drop the + 1 idea,
if (SIZE_MAX/n > size) return NULL;
my_realloc()
имеет различные проблемы:
Другая подпись
Я ожидаю, что цель «школа на самом деле не позволяет нам использовать calloc / realloc без перепрограммирования их» предназначалась для создания realloc()
замены, которой my_realloc()
не соответствует. Если требуется другая функция, рассмотрите новое имя
void *my_realloc(void *src, size_t size, size_t n)
// does not match
void *realloc(void *ptr, size_t size);
Невозможность обработать сокращающиеся ассигнования
При копировании данных не учитывается, что новое распределение может быть меньше предыдущего. Это приводит к UB.
Ненужный код
size < 0
всегда ложно
Утечка памяти
Приведенный ниже код не освобождает src
перед возвратом. Кроме того, он ничего не выделяет, когда n>0
. Это отличается от calloc(pit, 0)
и calloc(NULL, 42)
.
// missing free, no allocation
if (src == NULL || size < 0 || n < 1) {
return (NULL);
}
Предполагается строка
my_strlen(src)
предполагается, что src
указывает на допустимую строку. calloc()
не предполагает, что.