здесь я должен использовать snprintf
вместо strcy
, потому что это запрещено, и я не знаю, как
strcpy()
может переполниться, если место назначения недостаточно. Это действительно не применимо здесь, поскольку выделено необходимое пространство.
// array[i].data = (struct item*) malloc(sizeof(struct item));
// array[i].data->key = (char *)malloc((strlen(key)+1)*sizeof(char));
// strcpy(array[i].data->key, key);
array[i].data = malloc(sizeof *(array[i].data));
size_t sz = strlen(key) + 1;
array[i].data->key = malloc(sz);
snprintf(array[i].data->key, sz, "%s", key);
// or
strcpy(array[i].data->key, key);
// or
memcpy(array[i].data->key, key, sz);
Приведение не требуется
размер ссылочных данных лучше используйте этот тип sizeof.
Избегайте 2 поездок, определяющих длину.
Возвращает проверку, опущенную для краткости.
С проверками
array[i].data = malloc(sizeof *(array[i].data));
if (array[i].data == NULL) return fail; // or do something to indicate error
size_t sz = strlen(key) + 1;
array[i].data->key = malloc(sz);
if (array[i].data->key == NULL) return fail;
int count = snprintf(array[i].data->key, sz, "%s", key);
if (count < 0 || (unsigned) count >= sz) return fail;
Основная ошибка
Попытка OP не удалась, поскольку sizeof(key)
является размером указатель , возможно, 2, 4 или 8. Вместо этого необходим размер выделения для array[i].data->key
, как в sz
(см. выше) или strlen(key) + 1
.
snprintf(array[i].data->key,sizeof(key),"%s",key); // bad