将地址分配给通过引用传递的空指针
Assign address to void pointer passed by reference
第一次来电,长期倾听。我有一个关于 void * 指针的问题,似乎找不到解释,所以也许这里有人可以解释一下。
我有一个处理函数,其中(除其他事项外)我声明了一个空指针并将其通过引用向下传递给其他函数:
void some_handler(some args)
{
void * p_out_data;
some_other_function(&p_out_data);
// ... do some stuff with p_out_data after some_other_function stores an address
}
在some_other_function中,我分配了一些内存(多少取决于一些因素),将a_bunch_of_data复制到其中,并将其地址存储在p_out_data中,以便some_handler 可以访问 a_bunch_of_data:
void some_other_function(void * pp_out_data) // pp_out_data is the address of p_out_data
{
void * p = malloc(d_size);
memcpy(p, &a_bunch_of_data, d_size);
memcpy(pp_out_data, &p, sizeof(p));
}
一切正常。我的问题是:为什么将 malloc() 返回的内存地址存储到 p_out_data 中的唯一方法是使用 memcpy?我试图直接将地址存储在取消引用的指针中:
*pp_out_data = malloc(d_size);
但是我收到关于非法使用 void 指针的错误。我知道有很多关于 void 指针的规则,所以我猜这里有一个适用的特定规则?
您正在将一个 指针传递给一个指针,因此定义函数如下:
void some_other_function(void **pp_out_data)
{
void * p = malloc(d_size);
memcpy(p, &a_bunch_of_data, d_size);
*pp_out_data = p;
}
*pp_out_data
不是你的指针变量;它是你的指针变量指向的数据。
换句话说,您已经取消引用它了。
如果您希望新地址通过您的 pp_out_data
参数从您的函数中传递出去,那是行不通的; pp_out_data
中的地址正在按值传递。
return
函数的新地址改为:
void* some_other_function(void* pp_out_data)
{
void* p = malloc(d_size);
memcpy(p, &a_bunch_of_data, d_size);
memcpy(pp_out_data, &p, sizeof(p));
return p;
}
第一次来电,长期倾听。我有一个关于 void * 指针的问题,似乎找不到解释,所以也许这里有人可以解释一下。
我有一个处理函数,其中(除其他事项外)我声明了一个空指针并将其通过引用向下传递给其他函数:
void some_handler(some args)
{
void * p_out_data;
some_other_function(&p_out_data);
// ... do some stuff with p_out_data after some_other_function stores an address
}
在some_other_function中,我分配了一些内存(多少取决于一些因素),将a_bunch_of_data复制到其中,并将其地址存储在p_out_data中,以便some_handler 可以访问 a_bunch_of_data:
void some_other_function(void * pp_out_data) // pp_out_data is the address of p_out_data
{
void * p = malloc(d_size);
memcpy(p, &a_bunch_of_data, d_size);
memcpy(pp_out_data, &p, sizeof(p));
}
一切正常。我的问题是:为什么将 malloc() 返回的内存地址存储到 p_out_data 中的唯一方法是使用 memcpy?我试图直接将地址存储在取消引用的指针中:
*pp_out_data = malloc(d_size);
但是我收到关于非法使用 void 指针的错误。我知道有很多关于 void 指针的规则,所以我猜这里有一个适用的特定规则?
您正在将一个 指针传递给一个指针,因此定义函数如下:
void some_other_function(void **pp_out_data)
{
void * p = malloc(d_size);
memcpy(p, &a_bunch_of_data, d_size);
*pp_out_data = p;
}
*pp_out_data
不是你的指针变量;它是你的指针变量指向的数据。
换句话说,您已经取消引用它了。
如果您希望新地址通过您的 pp_out_data
参数从您的函数中传递出去,那是行不通的; pp_out_data
中的地址正在按值传递。
return
函数的新地址改为:
void* some_other_function(void* pp_out_data)
{
void* p = malloc(d_size);
memcpy(p, &a_bunch_of_data, d_size);
memcpy(pp_out_data, &p, sizeof(p));
return p;
}