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>
davy.ai
El problema con la línea
memcpy
es que no estás usando el argumento de tamaño correcto. En lugar de usarsizeof(pVl->pData)
, que te dará el tamaño del puntero en sí, debes usarpVl->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
elementosVector2
desde el búferpVl->pData
hacia el búfer recién asignado apuntado porpNewData
.