【问题标题】:Saving pointer to memory pointed by a void pointer保存指向由 void 指针指向的内存的指针
【发布时间】:2015-08-02 19:16:09
【问题描述】:

考虑以下情况。

我有一个void * first 指向一定数量的内存。我还有另一个 void * second 指向别的东西。我想将void * second 保存在第一个指针指向的内存中。

我的做法:

*(void**) first = second;

这有效吗?有什么需要考虑的预防措施吗?

【问题讨论】:

  • 是否要将数据从第二个区域复制到第一个区域?
  • 不,它不会那样做。很可能你想要memcpy(first, second, the_size);
  • 我想把第二个区的地址存到第一个区。
  • @TheParamagneticCroissant 虽然我同意memcpy 在这里可能是一个更好的主意,但我不太明白您所说的“它不会那样做”是什么意思。考虑using T = void*; T m; T* pm = &m; void* first = pm; *((T*)first) = second;
  • 这有点奇怪,老实说我不明白你为什么要这么做。您可能应该使用 static_cast 而不是 C 风格的强制转换,但这也有效,还要确保您正在访问对齐良好的内存(例如,如果您从 std::malloc 分配了 9 个字节,其地址存储在 @ 987654332@,您不能安全地将void* 存储在地址p+1)。

标签: c++ pointers memory void


【解决方案1】:

你可以在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*,然后再转换回去。您负责匹配类型。

【讨论】:

  • @JensMunk 似乎 StackOverflow 的评论格式对您的表达产生了不幸的影响,尤其是在 * 字符上。用反引号括起来 ` 以避免将 *italic text* 解释为 斜体文本
  • @dyp 谢谢,我会记住这个*(void**) first = second; 是完全有效的
【解决方案2】:

试试这个

#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]

【讨论】:

    猜你喜欢
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多