如何按顺序将大尺寸的void指针强制转换为不同的类型

时间:2016-10-14 23:47:13

标签: c

我希望将我的void指针值一个接一个地转换为不同的值。我是否只使用函数的大小添加最后一个类型的字节数?测试值只是我想用来放置这些值的内存空间。

void* test;

int* a = (int*)test;
*a = 5;

char*b = (char*)(test+sizeof(int));
*b = 'b';

int* c = (int*)(test+sizeof(int)+sizeof(char))
*c = 6;

2 个答案:

答案 0 :(得分:2)

最好使用char指针和memcpy。使用char指针允许您进行简单的指针数学运算(避免strict aliasing rule的任何问题)。使用memcpy可以避免任何对齐问题。

在下面的函数中,第一个参数是指向内存的指针,第二个参数是chars中该内存的大小。

void foo( void *test, int size )
{
    if ( size < 2*sizeof(int) + 1 )
        return;           // buffer is not big enough

    char *a = test;                 // int
    char *b = a + sizeof(int);      // char
    char *c = b + 1;                // int

    int value = 5;
    memcpy( a, &value, sizeof(int) );

    *b = 'b';

    value = 6;
    memcpy( c, &value, sizeof(int) );
}

要将其扩展为任意数量的项目,我会编写如下所示的代码。 (注意,这里没有安全网,传递给函数的缓冲区必须足够大以容纳所有值。)

void bar( void *test )
{
    char *ptr = test;

    int value = 5;
    memcpy( ptr, &value, sizeof(int) );
    ptr += sizeof(int);

    *ptr++ = 'b';

    value = 6;
    memcpy( ptr, &value, sizeof(int) );
    ptr += sizeof(int);

    // ...
}

答案 1 :(得分:1)

我认为这不是你想做的事。

如果要将某些对象复制到内存中,则应将memcpychar *用于某些内存缓冲区。是的,你会在每个sizeof()之后前进memcpy个字节。

char指针用于字节。当代码不知道类型是什么时使用void指针,比如将用户定义的回调和数据结构传递给库时。

创建一个线程,例如:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                   void *(*start_routine) (void *), void *arg);