simples simple operaciones listas lista ligadas estructura entre enlazadas enlazada ejemplos dobles doblemente diferencia datos con codigo c++ malloc linked-list memset

c++ - operaciones - listas simples estructura de datos



Implementación de memoria C++ e implementación de lista enlazada (4)

Estoy escribiendo software para simular el esquema de asignación de memoria de "primer ajuste".

Básicamente, asigno un gran trozo de memoria de X megabyte y lo subdivide en bloques cuando se solicitan trozos de acuerdo con el esquema.

Estoy usando una lista vinculada llamada "nodo" como encabezado para cada bloque de memoria (para que podamos encontrar el siguiente bloque sin recorrer tediosamente cada valor de la dirección).

head_ptr = (char*) malloc(total_size + sizeof(node)); if(head_ptr == NULL) return -1; // Malloc Error .. :-( node* head_node = new node; // Build block header head_node->next = NULL; head_node->previous = NULL; // Header points to next block (which doesn''t exist yet) memset(head_ptr,head_node, sizeof(node));

`

Pero esta última línea regresa:

error: invalid conversion from ''node*'' to ''int''

Entiendo por qué esto no es válido. ¿Pero cómo puedo colocar mi nodo en la ubicación del puntero de la memoria recién asignada?


Lee los documentos. memset toma un int (pero se interpreta como un unsigned char ) como un segundo parámetro. Esto especifica el valor para establecer los primeros n bytes, donde n es el tercer parámetro, de la región de memoria a.

Puede usar memcpy , que copiará una región de memoria a otra. Tratar:

memcpy(head_ptr, head_node, sizeof(node));

EDITAR: Otra alternativa es usar un molde de puntero de head_ptr para establecer los valores anteriores y siguientes, como lo sugiere Simon.


No puede asignar punteros como ese. El segundo argumento es int para ser repetido.

De memset(3) :

SYNOPSIS #include <string.h> void * memset(void *b, int c, size_t len); DESCRIPTION The memset() function writes len bytes of value c (converted to an unsigned char) to the byte string b. RETURN VALUES The memset() function returns its first argument.


Si entiendo su pregunta correctamente, quiere construir su objeto nodo en la memoria asignada y apuntada por head_ptr. Si necesita que se llame al constructor del nodo, haga esto a través del nuevo operador de ubicación de la siguiente manera:

node* head_node = new(head_ptr) node;

Si necesita asegurarse de que también se llama al destructor, entonces debe llamar eliminar manualmente:

head_node->~node();


memset(void* memory, int value, size_t size)

Por lo tanto, no es para copiar el head_node en head_ptr (estás pensando en memcpy ), es para inicializar la memoria (limpiar a 0, marcar como liberado, etc.).

En este caso, simplemente puedes convertir head_ptr en un node* :

node* head_node = (node*)head_ptr;

Y ahora no tiene que delete head_node , o copiar los valores a head_ptr en absoluto.