【问题标题】:Store and retrieve address/pointer to char array存储和检索 char 数组的地址/指针
【发布时间】:2016-05-18 04:00:42
【问题描述】:

假设我们有一个 char 数组:

char pool[1000];

还有一个指针

char* ptr;

指针将地址存储到池中的数据块。我想将此地址存储在池中并同时检索它。

基本上,我想做的是一个嵌入到 char 数组池中的链表。原因是我不允许(全局)创建任何新变量,并且我不能包含新的标头,以及其他限制。

所以问题是:我如何在 pool[] 的前 4 个元素中分割和拟合一个 4 字节地址(比方说),以及如何再次检索它以进行修改。强>

这个操作会经常发生,所以它需要快速......当然不能依赖外部函数。

【问题讨论】:

  • 听起来你想要类似于堆栈分配器的东西。您想如何跟踪池中已使用的部分?
  • @P0W 这很有帮助。但我不能声明全局变量,因此存储在池中。
  • @vu1p3n0x 是的,我正在制作一个分配器。堆栈分配器不适用于我的场景,因此它将成为某种形式的 freestore 分配器。我还没有达到跟踪块的地步。如您所见,我想先通过存储和检索日期:)。但我愿意接受这方面的建议。

标签: c++ arrays pointers linked-list


【解决方案1】:

要将ptr 的值存储在pool 中,请使用:

memcpy(pool, &ptr, sizeof(ptr));

要从pool 中检索指针的值,请使用:

memcpy(&ptr, pool, sizeof(ptr));

回复:

这个操作会经常发生,所以它需要快速......当然不能依赖外部函数。

memcpy 正是您所需要的。如果您不能使用memcpy,则需要在代码中实现确切的功能。

除非您能够验证对 memcpy 的调用是性能瓶颈,否则我建议您使用它。

【讨论】:

  • 我不能使用它,因为它需要 string.h/cstring 。我会努力写的
  • 所以我已经将这个实现用于 memcpy:code void myMemCpy(void *dest, void *src, size_t n) { // 将 src 和 dest 地址类型转换为 (char *) char *csrc = (char *)src; char *cdest = (char *)dest; // 将 src[] 的内容复制到 dest[] for (int i = 0; i code 它可以工作,但它不会将指针存储在数组中。它只是将指针设置为数组地址。
【解决方案2】:

如果您想将 ptr 存储在池中,那么您应该有一个地址池吗?

char *pool[1000];

然后

pool[0] = ptr;
ptr = pool[0];
etc.

如果你必须处理一个字符缓冲区,那就是

char pool[1000];

但将其视为地址缓冲区,然后通过创建局部变量来弯曲它:

char **pp = reinterpret_cast<char**>(&pool);
*pp = ptr;

后者将ptr存储在缓冲池的开头。要检索它:

ptr = *pp;

你可以通过增加指针pp沿着池移动

pp++ // next address

而且不要假设地址是 4 个字节!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 2021-11-28
    • 2021-07-18
    相关资源
    最近更新 更多