1

我的基本任务是将缓冲区数组的一个子集放入另一个缓冲区数组中:

char buffer[max_len];

unit8 *pDestBuffer;

我使用了这段代码,因为我想留在 ANSI-C 中:

memcpy(pDestBuffer, buffer, 4);

但是 - 一定有问题,因为我没有得到我期望的结果。因为,当我调试缓冲区时,我看到了数组的所有插槽- 当我使用 pDestBuffer 执行此操作时,我只得到一个项目 - 但是我可以更改它,例如memset(pDestBuffer,1,4)

pDestBuffer 是结构的一部分,除了上面的定义之外,唯一对它的引用是以下几行:

requiredMemory = sizeof(Structure) + bufferSize;
pStructure = (Structure *)HostMalloc(requiredMemory);
pStructure->pDestBuffer = ((uint8 *)pStructure)+sizeof(Sturcture);

我知道,这可能是一项相当基本的任务,我自己也在做这个,但是如果有“最佳实践”或者你知道解决方案,请与我分享。

作为一个转折点,我真的很想知道,是否有一种改进的方法,使用 boost-libraries,无论如何我都会使用它来解决其他问题。

4

3 回答 3

4

您的代码正在运行。仅仅因为您的调试器看不到数据并不意味着它不存在。发生的事情是你的代码说uint8_t * pDestbuffer;所以你的调试器认为 pDestBuffer 只是一个指向单个字节的指针,所以这就是它所显示的。但是你知道它实际上是一个指向数组的指针。

可能有一些方法可以告诉您的调试器这是一个数组,以便您可以查看所有数据。例如,我知道的一个调试器会让你输入pStructure->pDestBuffer,4说给我看四个字节,而不仅仅是一个。

于 2012-10-23T15:36:26.993 回答
2

我认为“最佳实践”不是混合 C++ 和 C 代码。

#include <array>
#include <vector>
#include <algorithm>

std::array<char, len> buffer;
std::size_t n = 5;
std::vector<char> dest; // if n is dynamic
dest.reserve(n); // "performance"
std::copy(begin(buffer), buffer + n, std::back_inserter(dest));

// or even shorter
std::vector<char> dest{begin(buffer), buffer + n};
于 2012-10-23T15:38:11.593 回答
1

boost库是C++。这是 C 还是 C++?

您在标题中说 C 并且您的代码是 C,但 C++ 确实是一种不同的语言,具有不同的写作风格。

“查看所有插槽”是什么意思?如果您指的是 Microsoft IDE,您所称的 unit8* 可能是您的意思uint8_t *或类似的意思,它是一个指针,它可能会将其解释为一个以空字符结尾的字符串,但更可能只是一个指针(由于它的符号)并显示它的含义指向而不是数组的开头。

于 2012-10-23T15:39:17.247 回答