我传递了一个指向该函数的指针,但是没有写入任何地址

我正在尝试编写简单的内存管理器。我有一个包含以下断言的测试文件:

VA page_1 = NULL;
void* pBuffer_1 = "0123";
size_t szBuffer_1 = sizeof("0123");

//right execution
assert(_write(page_1,pBuffer_1,szBuffer_1) == 0);

//assert pointer value
assert(*page_1 == pBuffer_1);

_write()函数:

int _write(VA ptr,void* pBuffer,size_t szBuffer)
{
    if (pBuffer == NULL) return -1;
    if (szBuffer < 1) return -1;
    if (szBuffer > MMEM.page_size - MMEM.table[MMEM.pages_filled].filled_bytes)
        return -2;

    memcpy(&MMEM.table[MMEM.pages_filled].data,pBuffer,szBuffer);
    ptr = &MMEM.table[MMEM.pages_filled];

    if (ptr == NULL) return 1;

    MMEM.table[MMEM.pages_filled].filled_bytes += szBuffer;
    MMEM.pages_filled++;

    return 0;
}

问题是第二个assert()由于page_1 == NULL而没有通过。在ptr = &MMEM.table[MMEM.pages_filled];之前ptrNULL之后的调试中。为什么在函数内可以起作用,但指针却是ptr 0x00fe5568 '0123'

lulou215 回答:我传递了一个指向该函数的指针,但是没有写入任何地址

该函数处理指针page_1的副本。函数参数是其局部变量。因此,函数中副本的任何更改都不会影响原始指针的值。

如果要在函数内更改指针的原始值,请通过引用将其通过指针传递给该指针。我假设代码是C代码。

int _write(VA *ptr,void* pBuffer,size_t szBuffer);

否则,将参数声明为具有引用类型。

int _write(VA &ptr,size_t szBuffer);
,

尝试一下:

assert(_write(page_1,pBuffer_1,szBuffer_1) == 0);
//...
int _write(VA& ptr,size_t szBuffer);  //NOTICE the & on ptr.

您正在按值传递page_1的值。功能上的所有更改将是原始page_1的副本。

本文链接:https://www.f2er.com/3146257.html

大家都在问