Soy un poco nuevo en C y tengo problemas para entender cómo funciona la memoria, especialmente las funciones integradas como memcpy
.C - Malloc y memcpy (gestión de memoria)
Aquí hay una struct
estoy usando
struct data_t {
int datasize;
void *data;
};
Y aquí es una función auxiliar que lo estoy usando con:
struct data_t *data_create(int size)
{
struct data_t *dt=malloc(sizeof(struct data_t)+size);
dt->datasize=size;
dt->data="1234567890a";
return dt;
}
Ahora en la función main
tengo ningún problema en hacer esto:
struct data_t *data = data_create(1024);
data->data="123456a";//just an example
Pero esto arroja una falla Seg:
memcpy(data->data,"123456a",strlen("1234567890a")+1);
Mi pregunta es ¿por qué? ¿Y cómo lo evito? Tenga en cuenta que soy nuevo en C, por lo que C trata de la memoria es un poco nuevo para mí
Gracias.
Editar: ¡Funciona! Muchas gracias. Completamente perdido el puntero de datos. Ahora todo está funcionando bien según valgrind.
espacio se asignó en la asignación inicial; el puntero simplemente no estaba configurado para señalar el espacio asignado. –
@JonathanLeffler: sí, el asker asignó un poco de espacio adicional al asignar inicialmente, debería haberse inicializado al punto. Seguiré prefiriendo la llamada explícita, si no hay una necesidad específica de asignar todo de una vez. – phoxis
Esto dará un error: "conversión inválida de 'void *' a 'data_t *' [-fpermissive]" para resolver "tiene que lanzar explícitamente el puntero devuelto por malloc". – VasaraBharat