使用 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
您需要完全重写函数。
我正在尝试编写类似于 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
您需要完全重写函数。