-3

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

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

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

4

3 回答 3

2

使用strtol指针不是一个非常便携的想法,因为long 不需要适合指针。执行您要查找的操作的最简单方法可能是将其替换为sscanf您可以使用的实际指针格式;

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

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

于 2013-02-26T05:35:41.323 回答
1
dsp((int *)strtol(b,16));

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

#include <stdlib.h>

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

int result;
result = (int) strtol(b, NULL, 16);
dsp(&result);
于 2013-02-26T05:23:10.800 回答
0

这是使用 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);
}
于 2013-02-26T06:04:15.003 回答