【问题标题】:Store pointer address in malloced memory在分配的内存中存储指针地址
【发布时间】:2012-11-07 17:05:19
【问题描述】:

这感觉像是一个愚蠢的问题,但我无法找到一个干净的解决方案,也无法在大量其他与指针相关的问题中找到类似的问题。

我有一些未知类型的动态分配内存,并希望在开始时在其中存储一个指针。 malloc 返回的动态内存应该适当对齐,因此我认为在写入分配块的开头时不必担心对齐问题。

这是我的代码,它可以工作,但我将指针表示为 64 位整数,并希望以更简洁/便携的方式进行:

void *my_area = malloc(512);
void *my_pointer = get_my_pointer();
((long long *) my_area)[0] = (long long) my_pointer;

【问题讨论】:

  • 或者你也可以使用uintptr_t

标签: c pointers


【解决方案1】:

long long 的演员阵容只是额外的包袱。改为转换为 void *

void *my_area = malloc(512);
void *my_pointer = get_my_pointer();
((void **) my_area)[0] = my_pointer;

(我假设这是针对某种 freelist 之类的,即您不需要同时使用该结构。)

【讨论】:

    【解决方案2】:

    my_area[0] 中的内容是指向某物的指针,对吧?

    然后您可以将 my_area 分配为void ** 类型,它表示指向包含内存区域的指针的指针。

    void **my_area = malloc(512 * sizeof(*my_area)); // alloc 512 pointer sized memory blocks
    void *my_pointer = get_my_pointer();
    my_area[0] = my_pointer;
    

    【讨论】:

      【解决方案3】:

      定义一个内部 8 字节数组的结构。用您的自定义结构替换所有 long long 类型引用。这样,您将不依赖于特定于平台的 long long 大小。该结构在所有平台上都是 64 位(如果您担心对齐,可以添加#pragma pack)

      【讨论】:

      • long long 已保证在所有平台上至少为 64 位,使用 struct 不会有任何改进。
      • 这仅适用于 C99 和 C++11。此外,大于 64 位也同样成功地破坏了可移植性。
      猜你喜欢
      • 1970-01-01
      • 2014-10-03
      • 1970-01-01
      • 2020-08-15
      • 1970-01-01
      • 2013-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多