es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Error utilizando memcpy: “Violación de acceso leyendo la ubicación 0x0000000000000000”.

Estoy tratando de escribir algo similar a std::vector pero en c para almacenar un conjunto de vectores matemáticos.

Aquí está la línea que está causando el error.

pVl->pData = memcpy(pNewData, pVl->pData, sizeof(pVl->pData));

Mi intención: Copiar datos desde pVl->pData a pNewData. Luego, asignar el valor de retorno, que es el puntero al inicio de la memoria de datos copiada, y asignarlo a pVl->pData. No estoy seguro de qué estoy haciendo mal.

MRE:

“`c
#include <stdlib.h>
#include <string.h>

typedef enum R_Code { R_OK, R_WARNING, R_FAIL, R_FATAL } R_Code;

struct Vector2_s
{
float x;
float y;
} const Default_Vector2 = { 0.0f, 0.0f };

typedef struct Vector2_s Vector2;

struct Vector2List_s
{
// capacidad actual de la lista
size_t capacity;

<pre><code>// tamaño actual de la lista
size_t size;

// búfer de datos
Vector2* pData;
</code></pre>

} const Default_Vector2List = { 0, 0, NULL };

typedef struct Vector2List_s Vector2List;

R_Code Vector2List_ReAllocateMem(Vector2List* pVl) {
if (pVl->capacity == 0) {
pVl->capacity++;
}

<pre><code>Vector2* pNewData = malloc(pVl->capacity * 2 * sizeof(Vector2));
if (pNewData == NULL) {
return R_FAIL;
}

pVl->capacity *= 2;
pVl->pData = memcpy(pNewData, pVl->pData, sizeof(pVl->pData));// SE LANZA LA EXCEPCIÓN EN ESTA LÍNEA
free(pNewData);
return R_OK;
</code></pre>

}

R_Code Vector2List_PushBack(Vector2List* pVl, const Vector2 v) {
if (pVl->size == pVl->capacity) {
R_Code rcode = Vector2List_ReAllocateMem(pVl);
if (rcode == R_FAIL) {
return rcode;
}
}

<pre><code>pVl->pData[pVl->size] = v;
pVl->size++;
return R_OK;
</code></pre>

}

int main() {

<pre><code>Vector2List vl = Default_Vector2List;
Vector2List_PushBack(&vl, Default_Vector2);
return 0;
</code></pre>

}
“`</string.h></stdlib.h>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema con la línea memcpy es que no estás usando el argumento de tamaño correcto. En lugar de usar sizeof(pVl->pData), que te dará el tamaño del puntero en sí, debes usar pVl->size * sizeof(Vector2) para copiar el tamaño real de los datos.

    Entonces, la línea corregida debería ser:

    pVl->pData = memcpy(pNewData, pVl->pData, pVl->size * sizeof(Vector2));

    Esto copiará pVl->size elementos Vector2 desde el búfer pVl->pData hacia el búfer recién asignado apuntado por pNewData.

Comments are closed.