【发布时间】: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 = &MMEM.table[MMEM.pages_filled]; 之前的调试中ptr 是NULL 和ptr 0x00fe5568 '0123' 之后。为什么在你的函数里面它可以工作,但在它外面我的指针是NULL?
【问题讨论】:
-
您将
page_1按值 传递给_write,因此您的函数参数ptr是page_1的副本。您在_write中的分配修改了本地副本,但对page_1的值没有任何影响。您可以将函数的签名更改为int _write(VA *ptr, void* pBuffer, size_t szBuffer),将其分配为*ptr = &MMEM.table[MMEM.pages_filled];并调用_write(&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++并删除另一个标签。已经有类似我评论的答案了。