【问题标题】:I pass a pointer to the function, but nothing is written to its address [duplicate]我传递了一个指向函数的指针,但没有写入它的地址[重复]
【发布时间】:2019-11-07 09:13:25
【问题描述】:

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

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 = &amp;MMEM.table[MMEM.pages_filled]; 之前的调试中ptrNULLptr 0x00fe5568 '0123' 之后。为什么在你的函数里面它可以工作,但在它外面我的指针是NULL

【问题讨论】:

  • 您将page_1 按值 传递给_write,因此您的函数参数ptrpage_1 的副本。您在_write 中的分配修改了本地副本,但对page_1 的值没有任何影响。您可以将函数的签名更改为int _write(VA *ptr, void* pBuffer, size_t szBuffer),将其分配为*ptr = &amp;MMEM.table[MMEM.pages_filled]; 并调用_write(&amp;page_1, pBuffer_1, szBuffer_1),或者使用返回值而不是函数参数将指针值传递给调用函数。
  • 您不应该使用assert 来检查函数调用的结果。 assert 是检查前置条件,检查失败表示编程错误并立即中止程序。最好使用if (_write(page_1, pBuffer_1, szBuffer_1) != 0) { fprintf(stderr, "_write failed ...\n"); exit(1); }之类的东西。
  • @Bodo,非常感谢!您可以写下答案,我会将其标记为有帮助
  • 请决定是使用C 还是C++ 并删除另一个标签。已经有类似我评论的答案了。

标签: c pointers reference


【解决方案1】:

该函数处理指针page_1 的副本。函数参数是它的局部变量。所以函数内对副本的任何更改都不会影响原始指针的值。

如果你想改变函数中指针的原始值,那么通过指向指针的指针通过引用传递它。我假设代码是 C 代码。

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

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

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

【讨论】:

  • 我有一个使用int _write(VA ptr, void* pBuffer, size_t szBuffer)签名的技术任务。我该如何使用它?
  • @PavelAntspovich 对于初学者来说,代码太糟糕了。所以我认为你不应该保持不变。如果不更改函数签名,您将无法完成任务。如果它是 C++ 代码,则将参数声明为引用类型,例如 Va &ptr。
【解决方案2】:

试试这个:

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

您正在按值传递 page_1 的值。函数中的所有更改都将是原始 page_1 的副本。

【讨论】:

    猜你喜欢
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 2018-04-05
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 2015-08-05
    相关资源
    最近更新 更多