保存指向由 void 指针指向的内存的指针
Saving pointer to memory pointed by a void pointer
考虑以下情况。
我有一个 void * first
指向一定数量的内存。我有另一个 void * second
指向其他东西。我想在第一个指针指向的内存中保存void * second
。
我的做法:
*(void**) first = second;
这个有效吗?有什么注意事项要考虑吗?
你可以向void*
指向的内存位置写入任何内容,只要:
- 足以容纳该数据类型
- 数据类型充分对齐
- 从与写入一致的位置读取
所以,做这样的事情是合法的:
void* first = malloc(sizeof(void*));
*(void**)first = second;
....
void* another = *(void**)first; //Now another == second
但是其他任何东西,例如:
malloc(sizeof(int*))
,或malloc(4)
void* first = &someCharArray[11]
int* another = *(int**)first
是否充其量定义了实现。有时是未定义的行为。
这正是 void*
键入的内容 - 您将一些指针投射到 void*
,然后再投回去。您负责类型匹配。
试试这个
#include <string.h>
#include <stdlib.h>
int main()
{
int memory[10];
void *first = ( void * )memory;
void *second = ( void * )&memory[5];
*( int * )first = ( int )second;
return 0;
}
您可以在内存中验证结果[0]
考虑以下情况。
我有一个 void * first
指向一定数量的内存。我有另一个 void * second
指向其他东西。我想在第一个指针指向的内存中保存void * second
。
我的做法:
*(void**) first = second;
这个有效吗?有什么注意事项要考虑吗?
你可以向void*
指向的内存位置写入任何内容,只要:
- 足以容纳该数据类型
- 数据类型充分对齐
- 从与写入一致的位置读取
所以,做这样的事情是合法的:
void* first = malloc(sizeof(void*));
*(void**)first = second;
....
void* another = *(void**)first; //Now another == second
但是其他任何东西,例如:
malloc(sizeof(int*))
,或malloc(4)
void* first = &someCharArray[11]
int* another = *(int**)first
是否充其量定义了实现。有时是未定义的行为。
这正是 void*
键入的内容 - 您将一些指针投射到 void*
,然后再投回去。您负责类型匹配。
试试这个
#include <string.h>
#include <stdlib.h>
int main()
{
int memory[10];
void *first = ( void * )memory;
void *second = ( void * )&memory[5];
*( int * )first = ( int )second;
return 0;
}
您可以在内存中验证结果[0]