new_data->data = malloc(sizeof(*data));
new_data->data = data;
Сначала вы выделяете память, затем теряете указатель (утечка памяти) и перезаписываете значение указателя значением указателя данных.Вторая строка копирует значение указателя, а не байты за указателями.Для этого используйте memcpy
.
Возможно, вы захотите:
new_data->data = malloc(size);
memcpy(new_data->data, data, size);
Это позволит выделить новый блок памяти размером size
байтов и скопировать size
байтов данных, на которые указывает data
указатель.
Пример:
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
struct test_t {
size_t size;
void *data;
};
struct test_t *data_create(size_t size, void *data){
if (size <= 0 || data == NULL) return NULL;
struct test_t *new_data = malloc(sizeof(struct test_t));
if (new_data == NULL) {
goto NEW_DATA_MALLOC_ERR;
}
new_data->size = size;
new_data->data = malloc(size);
if (new_data->data == NULL) {
goto NEW_DATA_DATA_MALLOC_ERR;
}
memcpy(new_data->data, data, size);
return new_data;
NEW_DATA_DATA_MALLOC_ERR:
free(new_data);
NEW_DATA_MALLOC_ERR:
return NULL;
}
void data_destroy(struct test_t *data) {
if (data->data == NULL) {
free(data->data);
}
free(data);
}
int main() {
int object = 1;
struct test_s *A = data_create(sizeof(object), &object);
data_destroy(A);
}