使用 memcpy 时出错:"Access violation reading location 0x0000000000000000"

Error using memcpy : "Access violation reading location 0x0000000000000000"

我正在尝试编写类似于 std::vector 但在 c 中存储一堆数学向量的东西。

这是错误所在的行。

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

我的意图:将数据从 pVl->pData 复制到 pNewData。然后赋值return,也就是 指向新复制的数据存储器开始的指针并将其分配给 pVl->pData。我不确定我做错了什么。

MRE:

#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
{
    //current capacity of the List
    size_t capacity;

    //current size of the list 
    size_t size;

    //data buffer 
    Vector2* pData;

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

typedef struct Vector2List_s Vector2List;

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

    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));//EXPECTION THROWN IN THIS LINE
    free(pNewData);
    return R_OK;
}

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;
        }
    }

    pVl->pData[pVl->size] = v; 
    pVl->size++;
    return R_OK;
}

int main() {

    Vector2List vl = Default_Vector2List;
    Vector2List_PushBack(&vl, Default_Vector2);
    return 0;
}

在函数 Vector2List_ReAllocateMem 中,您动态分配了内存

Vector2* pNewData = malloc(pVl->capacity * 2 * sizeof(Vector2));

然后在这个声明中

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

您正在使用空指针 pVl->pData 作为调用未定义行为的数据源。

此外,您释放了分配的内存。

free(pNewData);

同样使用这个表达式 sizeof(pVl->pData) 没有意义。

看来您需要的是以下内容

pVl->pData = pNewData;

不过,如果您要重新分配内存,那么您需要使用 realloc.

而不是 malloc

您需要完全重写函数。