Ваша первая ошибка заключается в следующем:
struct data_t *dt=malloc(sizeof(struct data_t)+size);
Это создаст кусок памяти размера struct data_t + size.Я думаю, что вы ожидали, что ваше поле данных внутри data_t может использовать эту память, но не может, потому что данные не содержат адрес этой памяти.
Ваша вторая ошибка заключалась в том, что вы копировали значениеследующая строка в «data»:
data->data="123456a";
Фактически, здесь произошло то, что в памяти есть строка «123456a», которая существует на протяжении всей жизни вашей программы.Когда вы назначаете «123456a» для data-> data, на самом деле происходит то, что вы берете адрес этой строки «123456a» и помещаете его в data-> data, вы копируете не значение («123456a»), а местоположениеили адрес (0x23822 ...) "123456a".
Ваша последняя ошибка была следующей:
memcpy(data->data,"123456a",strlen("1234567890a")+1);
Вы пытались скопировать значение "123456a" в память, указанную данными.На что указывают данные?Он указывает на область памяти, доступную только для чтения и содержащую ранее назначенную строку «123456a».Другими словами, вы сказали вашей программе писать по адресу «123456a».
Вот программа, которая будет делать то, что вы ожидаете:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
typedef struct {
size_t datasize;
char *data;
} data_t;
data_t *data_create(size_t size)
{
data_t *dt;
dt = malloc(sizeof(data_t));
assert(dt != NULL);
dt->data = malloc(size);
assert(dt->data != NULL);
dt->datasize = size;
/* need to decide what to do when this happens */
assert((strlen("1234567890a") + 1) < size);
strcpy(dt->data, "1234567890a");
return dt;
}
void data_destroy(data_t *dt)
{
free(dt->data);
free(dt);
}
int main(void)
{
data_t *data = data_create(1024);
/* data->data="123456a"; DONT DO THIS YOU WILL CAUSE A MEMORY LEAK */
assert(data->datasize >= (strlen("123456a")+1));
memcpy(data->data, "123456a", strlen("123456a")+1);
printf("%s\n", data->data);
data_destroy(data);
return EXIT_SUCCESS;
}