Вам нужно использовать strlen, а не sizeof.item
передается как указатель, а не как массив.
Строка:
char temp[sizeof(item) + sizeof(bloom->hash_salts[i]) + 2];
сделает temp 34x длиной указателя + 2. Размер элементаразмер указателя, а sizeof(bloom->hash_salts[i])
в настоящее время в 33 раза больше размера указателя.
Вам необходимо использовать strlen для item
, чтобы вы знали фактическое количество символов.
Во-вторых, bloom->hash_salts[i]
- это hash_function_salt
, который представляет собой массив из 33 указателей на символ.Кажется, что hash_function_salt
должен быть определен как:
, так как вы хотите, чтобы он содержал 33 символа, а не 33 указателя.Также следует помнить, что когда вы передаете строковый литерал в bloom_filter_create, вы передаете указатель.Это означает, что для инициализации массива hash_function_salt
мы используем memcpy или strcpy.memcpy быстрее, когда мы знаем точную длину (как здесь):
Таким образом, мы получаем:
typedef unsigned char hash_function_salt[33];
и bloom_filter_create
:
memcpy(bloom->hash_salts[i], va_arg(args, char*), sizeof(bloom->hash_salts[i]));
Возвращениедля bloom_operation мы получаем:
char temp[strlen(item) + sizeof(bloom->hash_salts[i])];
strcpy(temp, item);
strcat(temp, bloom->hash_salts[i]);
Мы используем strlen
для элемента, так как это указатель, но sizeof
для hash_function_salt
, который является массивом фиксированного размера char.Нам не нужно ничего добавлять, потому что hash_function_salt уже содержит место для NUL
.Сначала используем strcpy
.strcat
для случая, когда у вас уже есть строка с NUL-окончанием (чего у нас нет).Обратите внимание, что мы опускаем *.Это была ошибка из-за неверного определения типа.