假设我有一个int
值,例如10000
,我想将此值用作内存地址并访问它以查看其内容。我尝试过以下方法:
sscanf(arguments, "%d", &address);
int * addpointer;
addpointer = (int *) address;
printf("000%d ", address);
printf(addpointer);
但这引发了一个段错误。完成此任务的最佳方法是什么?
答案 0 :(得分:2)
这是不可能的
printf(addpointer);
printf()
期望它的第一个参数是一个字符串,并且您传递的是int
指针,它甚至没有指向有效的地址。
printf()
的第一个参数是一个格式字符串,所以,如果你想打印指针的值,那么
printf("%p\n", addpointer);
上面的printf(addpointer);
是未定义行为的原因,这就是您遇到分段错误的原因。
您尝试做的事情是不可能的,您只能尝试检查您提供的任意地址的内容,这些内容甚至没有意义,因为您无法做到确保该地址有数据,而且如果有任何数据,您无法知道有多少数据。
答案 1 :(得分:2)
代码是正确的,因为它完全按照你所说的去做。
除此之外,这种方法无可救药地被误导了。你怎么能期望一个变量包含一个可以从当前进程访问的有效内存位置?
请解释为什么您认为address
中的值是有效的,有意义的地址,然后我们可以解释为什么该假设无效。
如果你的假设是你可以随便检查你想要的任何内存地址,那么这个假设是错误的,原因有两个。首先,保护模式处理器出于安全原因限制应用程序可用的内存。其次,内存地址通常是虚拟的,因此它甚至不是内存中的真实位置。尝试访问无效或受保护的位置会产生类似您所看到的错误。
最后,即使它是有效的,假设随机地址指向可以有意义地传递给printf()
的东西,这需要一个有效的,以null结尾的字符串,这是另一个错误的假设。
答案 2 :(得分:0)
以下程序适合我。我相信这或多或少是你要做的事情:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
static int data = 42;
static int bss;
int *pointer = malloc(sizeof *pointer);
puts("Some hints: there is");
printf(" lib @ %p\n", printf);
printf(" text @ %p\n", main);
printf(" data @ %p\n", &data);
printf(" bss @ %p\n", &bss);
printf(" heap @ %p\n", pointer);
printf(" stack @ %p\n", &pointer);
fputs("Address: ", stdout);
if (scanf("%p", &pointer) != 1) return EXIT_FAILURE;
printf("memory[%p] = %d\n", pointer, *pointer);
return EXIT_SUCCESS; /* if still alive... */
}
如果我与提供的提示保持足够接近,它甚至不会发生段落错误......
请注意,尽管您可以在典型的PC上查看main()
或printf()
,但无法保证在任何地方都可以使用。功能甚至可能存在于与数据不同的地址空间中。