#include <assert.h>
#include <stdlib.h>
void callback(const unsigned char *data, int len) {
assert(len >= 0);
unsigned char *copy = malloc(len);
if (copy == NULL) { abort(); }
memcpy(copy, data, len);
/* TODO: Store the length somewhere, since otherwise the pointer is useless. */
/* TODO: pass the pointer "copy" somewhere, so it is used. */
}
Обычно вторым аргументом такой функции обратного вызова является тип без знака, например unsigned int
или size_t
. Поэтому я добавил assert
, просто чтобы быть уверенным, что не будет никакого неопределенного поведения .
memcpy
четко определен в стандарте C, в то время как bcopy
является старой версией и не гарантирует, что она будет существовать или даже работать так, как вы ожидаете. (Хотя обычно, если он существует, он будет делать то, что вы ожидаете.)