【问题标题】:Save pointer's memory address保存指针的内存地址
【发布时间】:2013-12-22 21:20:22
【问题描述】:

当我使用malloc() 分配指针时,我必须实现一个函数,该函数返回指针的内存地址。我知道malloc(value) 在堆上分配了一个大小为value 的区域。

我知道如何实现打印该指针的内存地址的代码:

    void *s = malloc (size)
    printf("%p\n",s);

我的问题是,如何将该代码打印的值保存在 int 或字符串(例如 char *)中?

【问题讨论】:

  • 你打算用它做什么?您是否只想将字符串用于打印目的?这只是一个 char 数组,就像任何其他字符串一样。或者您是否试图存储指针本身的值?那只是s

标签: c unix pointers malloc


【解决方案1】:

在字符串中存储指针的值(即某个变量的内存位置)可以像使用 printf 一样完成:

char buf[128];
void *s = malloc (size);
sprintf(buf, "%p\n",s);

要将值“保存”为整数(类型),您可以进行简单的转换:

void *s = malloc (size);
size_t int_value = (size_t)s;

由于在 c 中你永远不知道你的机器地址指针长度是多少,所以这(从技术上)不能保证完全正确;对于古怪的架构或编译器,这两种方法都可能出错。

【讨论】:

  • 对于从函数“返回”值不起作用,因为一旦函数返回,buf 将不存在。
  • @Floris 是的.. 但这有点迂腐。 Markos Horro Varela 并没有要求这种品质。
  • 我认为问题始于“当我使用 malloc() 分配指针时,我必须实现一个返回指针内存地址的 函数”。显然,我们对此的解释不同。
  • “size_t”+1。我们正在移植到 VisualStudio 2015 中的 Windows 10 UWP 应用程序,并且“int”没有编译!
【解决方案2】:
char buf[32] = {0}
snprintf(buf, sizeof buf, "%p\n", s);

然后你就可以打印了:

printf("%s\n", buf);

【讨论】:

    【解决方案3】:

    您已经将该值保存为 s 中的位模式,因此我假设您的意思是您只是希望 printf 输出的文本为字符串。你想要的调用是 sprintf:

    char text[255];
    sprintf(text, "%p\n", s);
    

    【讨论】:

      【解决方案4】:

      如果你想从你的函数返回指针地址,你可以声明你的函数返回指针类型:

      int* myFunc(int n) {
        int* p;
        p = malloc(n*sizeof(int));
        // more stuff
        return p;
      }
      

      这是其他答案建议(非常合理地)使用sprintf 的替代方法。

      任你选。

      请注意,在某些系统上,int 不足以容纳 int* 数据类型 - 使用 int* 不仅更清晰而且更安全。

      【讨论】:

        【解决方案5】:

        是的 sprintf() 是最好的选择。在这里,您可以简单地在字符串中取任何东西。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-03
          • 1970-01-01
          • 2020-07-03
          • 1970-01-01
          相关资源
          最近更新 更多