保存指向由 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]