如何将表存储到void表

时间:2017-03-14 19:02:55

标签: c

我有以下代码:

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];

3 个答案:

答案 0 :(得分:1)

您需要复制数据,因为cbuffill_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];
    }
}