通过指针不更新内存地址

时间:2016-07-07 12:32:36

标签: c++

我想要读回存储在缓冲区中的数据。我有一个函数,它将指向unsigned char数组的指针作为参数。我希望这个参数被填充(指向)我想要获取的缓冲区的地址。

在函数内部我可以看到调试时传入的参数正在正确更新(Mock类),但是一旦我从这个函数返回到调用方法(Connection类),所有数据都会丢失。

请有人帮我理解为什么会这样吗?

先谢谢

单元测试

///单元测试失败,因为预期的数据不在缓冲区中

TEST(MemoryTest, TestWriteAndRead)
{
        Connection* p_conneciton = new Connection();

        /// Write
        uint8_t txBuffer[_USB_PACKET_SIZE] = _CMD;
        ASSERT_EQ(p_memory->Write(txBuffer), true);

        /// Read
        uint8_t* rxBuffer;

        ASSERT_EQ(p_memory->Read((unsigned char*)&rxBuffer), true);

        ASSERT_EQ(rxBuffer[0], 0xaa);
    }

连接类

/// Information is lost here in _pu8_buffer
bool Connection::Read(uint8_t* _pu8_buffer)
{
    int i_bytesRead = 0;
    while(i_bytesRead != SIZE) {
        i_bytesRead = read_timeout(_pu8_buffer, _PACKET_SIZE);
        if ( i_bytesRead < _PACKET_SIZE) {
            return false;
        }
    }
    return true;
}

模拟课程

/// Information is copied correctly here from mpuc_data to data
int Mock:read_timeout(unsigned char* data, size_t length)
{
    if (data == nullptr) {
        return -1;
    }
    data = mpuc_data;

    return 0;
}

2 个答案:

答案 0 :(得分:1)

/// Information is lost here in _pu8_buffer
bool Connection::Read(uint8_t* _pu8_buffer)
{
    int i_bytesRead = 0;
    while(i_bytesRead != SIZE) {
        i_bytesRead = read_timeout(_pu8_buffer, _PACKET_SIZE);
        if ( i_bytesRead < _PACKET_SIZE) {
            return false;
        }
    }
    return true;
}

调用此函数会获取传递给它的指针的副本。这意味着如果更改指针指向的位置,则只更改本地副本。

您可以更改将read_timeout中的数据设置为:

的方式
*data = mpuc_data;

或者您将指针传递到uint8_t**中的指针(Connection::Read)并调用read_timeout(&_pu8_buffer, _PACKET_SIZE);

此外,您目前的方式&rxBuffer不正确,应为rxBuffer。如果您将签名更改为uint8_t**,则仅传递地址。

答案 1 :(得分:1)

您需要传递要修改的参考参数。如果你想修改一个指针的值,你需要通过引用传递指针 - 它本身就是一个引用(对其他东西)没有帮助。

尝试

int Mock:read_timeout(unsigned char*& data, size_t length)
{
    if (data == nullptr) {
        return -1;
    }
    data = mpuc_data;

    return 0;
}
这样,_pu8_buffer实际上会在每次调用mpuc_data后指向read_timeout。您可以使用函数Read执行相同的操作。

一般来说,要注意间接水平。与

uint8_t* rxBuffer;

ASSERT_EQ(p_memory->Read((unsigned char*)&rxBuffer), true);

您正在获取uint8_t*的地址,获得指向指针的uint8_t**指针。然后你把它投到unsigned char* - 一个简单的,而不是双指针! (然后隐含地uint8_t*当它成为参数时)它不能很好地结束......并且它以尝试读取字符数组结束,其中前4或8实际上是字节你的指针,其次是其他垃圾。

如果要修改指针的地址是正确的,但是您需要在另一侧获得uint8_t**,并将其称为*_pu8_buffer