我开发了一个函数,用于将元素从一个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);
如何在不出现此问题的情况下实现我所寻求的功能?或者有没有其他更好的方法可以完全实现这一点?
提前谢谢。
- 添加显示缓冲区大小的附加参数。返回值NULL表示缓冲区已满
- CCD_ 2不指向下一个"0";免费的";字符,仅在后面一个
- 使用正确的尺寸类型
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
作为size
和i
的类型 - 自变量的顺序令人困惑,因为它与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);
你应该考虑使用这个,因为它在支持它的系统上进行了优化,并且可以很容易地添加到缺乏它的系统中