字符串到地址C.

时间:2013-02-26 05:16:13

标签: c string pointers memory-address

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

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

有人可以说明上面有什么问题和/或如何去做吗?任何帮助,将不胜感激。 谢谢。

3 个答案:

答案 0 :(得分:2)

a long is not required fit a pointer以来,使用strtol作为指针并不是一个非常便携的想法。做你正在寻找的最简单的方法可能就是用sscanf替换它,它有一个你可以使用的实际指针格式;

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

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

答案 1 :(得分:1)

dsp((int *)strtol(b,16));

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

#include <stdlib.h>

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

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

答案 2 :(得分: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);
}