复制缓冲区并返回指向下一个可用元素的指针的最佳方式是什么



我开发了一个函数,用于将元素从一个unsigned char缓冲区复制到另一个。我设计了一个函数,将指针返回到目标缓冲区中的下一个可用(空(元素。这样做的目的是,如果我选择再次调用函数并将更多数据写入目标缓冲区(从其他源缓冲区(,我就知道从哪里开始向目标缓冲区写入。以下是功能:

unsigned char *copyBuffer(unsigned char *sourceBuf,
unsigned char *destBuf, 
int size)
{
int i = 0;
for (i; i < size; ++i) {
*(destBuf + i) = *(sourceBuf + i);
};

// return a pointer to the next unpopulated element in the dest buffer
return (destBuf + i + 1);
}

我面临的困境是,尽管这编译得很好,但我认为我可能会遇到运行时问题,因为一旦目标缓冲区完全填满,我可能会引用一个越界指针。

例如:

unsigned char destBuf[10];
unsigned char sourceBuf1[6];
unsigned char sourceBuf2[4];
unsigned char *pBuffer = NULL;
pBuffer = copyBuffer(sourceBuf1, destBuf, 6);
copyBuffer(sourceBuf2, pBuffer, 4);

在第二次复制操作之后,返回的指针不会越界吗,因为我的函数的最后一行是

return (destBuf + i + 1);

如何在不出现此问题的情况下实现我所寻求的功能?或者有没有其他更好的方法可以完全实现这一点?

提前谢谢。

  1. 添加显示缓冲区大小的附加参数。返回值NULL表示缓冲区已满
  2. CCD_ 2不指向下一个"0";免费的";字符,仅在后面一个
  3. 使用正确的尺寸类型
unsigned char* copyBuffer(const unsigned char *sourceBuf, unsigned char *destBuf, const size_t size, const size_t destbuffsize)
{
char *result = NULL;
memcpy(destBuf, sourceBuf, size <= destbuffsize ? size : destbuffsize);

if(size < destbuffsize) result = destBuf + size;
return result;
}

您的方法中存在一个问题:虽然返回一个超过数组最后一个元素地址的指针是可以的,但实际上返回的指针超出了末尾1个字节。这就是目的吗?i在最后一个拷贝之后递增,因此buf + i指向下一个可用元素。

还应注意以下备注:

  • sourceBuf应声明为const unsigned char *,因为您不修改源缓冲区
  • for循环的主体之后的;是冗余的,将其移除
  • 在CCD_ 10的第一子句中的孤独的CCD_
  • 我建议使用size_t作为sizei的类型
  • 自变量的顺序令人困惑,因为它与CCD_ 14的顺序相反

这是一个修改后的版本:

unsigned char *copyBuffer(unsigned char *destBuf,
const unsigned char *sourceBuf,
size_t size)
{
size_t i;
for (i = 0; i < size; ++i) {
destBuf[i] = sourceBuf[i];
}

// return a pointer to the next unpopulated element in the dest buffer
return destBuf + i;
}

增加指针可以实现更简单的版本:

unsigned char *copyBuffer(unsigned char *destBuf,
const unsigned char *sourceBuf,
size_t size)
{
while (size --> 0) {
*destBuf++ = *sourceBuf++;
}
// return a pointer to the next unpopulated element in the dest buffer
return destBuf;
}

上述函数的行为与GNU libC中可用的mempcpy()和其他一些函数的行为相同:

void *mempcpy(void *dest, const void *src, size_t n);

你应该考虑使用这个,因为它在支持它的系统上进行了优化,并且可以很容易地添加到缺乏它的系统中

最新更新