我有以下代码:
void fill_buffer(void *buffer)
{
char cbuf[20]={1,2,3,4,5,6,7,8,9,9,9,9,9,9,9,11,12,13,14,15};
void* vbuf = (void*) cbuf;
buffer=vbuf;
}
我正在尝试填充从main函数给我的缓冲区,但我不确定如何正确填充void表。在主函数缓冲区中定义:
unsigned char buffer[20];
答案 0 :(得分:1)
您需要复制数据,因为cbuf
是fill_buffer()
的本地数据,并且在函数返回时将被解除分配,尝试执行此操作
void
fill_buffer(void *buffer, size_t bufsize)
{
static const unsigned char cbuf = {
1, 2, 3, 4, 5, 6, 7, 8,
9, 9, 9, 9, 9, 9, 9, 11,
12, 13, 14, 15
};
if (bufsize > sizeof(cbuf) / sizeof(*cbuf))
bufsize = sizeof(cbuf) / sizeof(*cbuf);
memcpy(buffer, cbuf, bufsize);
}
您应确保目标buffer
分配了足够的存储空间,在本例中为bufsize
个字节,但如果cbuf
的元素类型不同,您可能会必须使用sizeof(element_type)
。
另外,也许您可以返回实际复制的字节数。
答案 1 :(得分:0)
允许x8
创建自己的数组,从而确保所有内容最终都在缓冲区中的替代方法是:
x8
您可以在fill_buffer
中使用它,如下所示:
void fill_buffer(void **buffer) {
static const unsigned char cbuf[4] = {
'a', 'b', 'c', 0,
};
*buffer = (void*)cbuf;
}
答案 2 :(得分:0)
Dunno和Iharob Al Asimi的回答是正确的,但这里解释了为什么你的代码不起作用:
您的函数将指针作为参数,从您在参数中传递的参数复制。因此,修改函数内的指针不会改变最初传递给函数的指针。
void fill_buffer(void *buffer);
int main()
{
void* ptr = (void*) NULL;
fill_buffer(ptr);
printf("%d", ptr);
return 0;
}
打印:0
这就是Dunno使用指向指针的原因,以便更改原始指针的值。
此外,这里是您的代码的修改版本(但编码不好,使用Dunno或Iharob Al Asimi的解决方案):
void fill_buffer(void *buffer);
int main()
{
unsigned char buffer[20];
fill_buffer(buffer);
for(unsigned int i = 0; i < 20; i++)
{
printf("%d\n", buffer[i]);
}
return 0;
}
void fill_buffer(void *buffer)
{
unsigned char* buff = buffer;
unsigned char cbuf[20]={1,2,3,4,5,6,7,8,9,9,9,9,9,9,9,11,12,13,14,15};
for(unsigned int i = 0; i < 20; i++)
{
buff[i] = cbuf[i];
}
}