【问题标题】:string to address C字符串到地址 C
【发布时间】:2013-02-26 05:16:12
【问题描述】:

我要完成的工作的本质如下。我想将一个整数地址(整数指针)以字符串的形式传递给一个期望整数指针作为参数的函数。在简单的代码方面,我想做以下事情:

void dsp(int *);

int main() {

  char *b;
  int a=2;p=&a;
  b = (char *)malloc(100*sizeof(char));
  sprintf(b, "%p",p);
  puts( b );
  dsp(&a);
  dsp((int *)strtol(b,16));
  free(b);
return 0;
}

void dsp(int *addr)
{ 
  printf("val:%d\n",*addr);
}

这就是我的输出:

0x7fbffffa6c   (from puts(b))
val:2
Segmentation fault

任何人都可以建议上面有什么问题和/或如何解决吗?任何帮助,将不胜感激。 谢谢。

【问题讨论】:

  • 对不起,psprintf() 是什么关系?
  • 有未声明的变量,你是怎么编译出来的?
  • strtol 不带 2 个参数且 sprintf 不安全,如果您希望我们提供帮助,请分享原始代码。
  • 为什么是strtol 而不是strtoll? Iow,您确定您的指针适合long 而不是long long

标签: c string pointers memory-address


【解决方案1】:

使用strtol 作为指针并不是一个非常便携的想法,因为a long is not required fit a pointer。执行您要查找的操作的最简单方法可能是将其替换为 sscanf,它具有您可以使用的实际指针格式;

dsp(&a);
int* recovered_pointer;
sscanf(b, "%p", &recovered_pointer);
dsp(recovered_pointer);

附带说明,您没有将所有 3 个必需参数传递给 strtol,即使 long “足够长”以适合指针,这也不起作用。包含所需的头文件总是一个好主意,因为在这种情况下,它们将帮助编译器在编译时告诉您您的代码将中断。

【讨论】:

    【解决方案2】:
    dsp((int *)strtol(b,16));
    

    首先,您在这里缺少一个参数。 strtol() 接受三个参数。您可能会收到编译器警告。不要忽视那些!如果您在源文件顶部添加正确的#include,则警告将变成错误(这是一件好事):

    #include <stdlib.h>
    

    其次,您需要将 strtol() 的结果存储在变量中,以便获取变量的地址。您不能获取函数返回值的地址。在前面添加(int *) 并不会这样做(尽管它确实使编译器能够接受错误的代码)。

    int result;
    result = (int) strtol(b, NULL, 16);
    dsp(&result);
    

    【讨论】:

      【解决方案3】:

      这是使用 32 位和 64 位 VS2012 编译器测试的工作代码:

      #include <stdlib.h>
      #include <stdio.h>
      
      void dsp(int*);
      
      int main()
      {
          char *b;
          int* t;
          int a = 2;
          b = malloc(100 * sizeof(char));
          sprintf(b,"%p", &a);
          dsp(&a);
          sscanf(b,"%p",&t);
          dsp(t);
          free(b);
          return 0;
      }
      
      void dsp(int* addr)
      {
          printf("val:%d\n", *addr);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-11
        • 1970-01-01
        • 1970-01-01
        • 2012-05-26
        • 1970-01-01
        • 2019-04-08
        • 2021-08-30
        • 1970-01-01
        相关资源
        最近更新 更多