我想要完成的内容如下。我想传递一个整数(整数指针)的地址,它是一个字符串形式的函数,期望一个整数指针作为参数。就简单代码而言,我想做以下事情:
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
有人可以说明上面有什么问题和/或如何去做吗?任何帮助,将不胜感激。 谢谢。
答案 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);
}