我希望将我的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;
答案 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)
我认为这不是你想做的事。
如果要将某些对象复制到内存中,则应将memcpy
和char *
用于某些内存缓冲区。是的,你会在每个sizeof()
之后前进memcpy
个字节。
char
指针用于字节。当代码不知道类型是什么时使用void
指针,比如将用户定义的回调和数据结构传递给库时。
创建一个线程,例如:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);