我有一个函数需要两个指针,一个指向字符串对象,一个指向自定义 KCData 对象:
void KCConverter::dataToHexStringBuf(std::string *hexStringBuf, KCData *data) {
char hexBuf[2];
size_t position = data->getPosition();
size_t length = data->getLength();
uint8_t *copy = new uint8_t[data->getLength()];
memcpy(copy, data->bytes, data->getLength());
uint8_t current;
for (size_t i = position; i < length; i++) {
std::cout << "Reading char " << i << std::endl;
current = copy[i];
sprintf(hexBuf, "%02X", current);
hexStringBuf->push_back(hexBuf[0]);
hexStringBuf->push_back(hexBuf[1]);
}
data->setPosition(data->getLength());
}
但是 KCData 指针的值在 for 循环中发生变化:
第一次迭代:
第二次迭代:
第三次迭代:
但是,如果我取消注释 sprintf(hexBuf, "%02X", current);
行,指针不再改变。但为什么是sprintf
更改 data
的指针地址????
P.S.:如果您否决了我的问题,最好了解原因,以便我可以改进我的问题:)
最佳答案
您溢出了hexBuf[]
:
char hexBuf[2]; // 2 bytes long
...
sprintf(hexBuf, "%02X", current); // Writing 3 bytes
您必须在输出字符串的长度中包含空字符 \0
。解决方案是使 hexBuf[]
长度至少为 3 个字节。
关于C++ 对象指针改变位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30426410/