C 通过int值访问地址
假设我有一个C 通过int值访问地址,c,memory,C,Memory,假设我有一个int值,比如10000,我想使用这个值作为内存地址,并访问它来查看它的内容。我尝试了以下方法: sscanf(arguments, "%d", &address); int * addpointer; addpointer = (int *) address; printf("000%d ", address); printf(addpointer); 但这会造成seg故障。完成此任务的最佳方式是什么?这是不可能的 printf(addpointer); prin
int
值,比如10000
,我想使用这个值作为内存地址,并访问它来查看它的内容。我尝试了以下方法:
sscanf(arguments, "%d", &address);
int * addpointer;
addpointer = (int *) address;
printf("000%d ", address);
printf(addpointer);
但这会造成seg故障。完成此任务的最佳方式是什么?这是不可能的
printf(addpointer);
printf()
printf()
的第一个参数是一个格式字符串,因此,如果要打印指针的值,那么
printf("%p\n", addpointer);
printf(addpointer)上面的代码>是未定义行为的原因,这就是为什么会出现分段错误
您试图做的是不可能的,您不能只是尝试检查您提供的某个任意地址的内容,这甚至没有意义,因为您无法确定该地址是否有数据,而且如果有数据,您也无法知道有多少数据。这是不可能的
printf(addpointer);
printf()
printf()
的第一个参数是一个格式字符串,因此,如果要打印指针的值,那么
printf("%p\n", addpointer);
printf(addpointer)上面的代码>是未定义行为的原因,这就是为什么会出现分段错误
你想做的是不可能的,你不能只检查你提供的任意地址的内容,这根本没有意义,因为你不能确定该地址是否有数据,此外,如果存在任何数据,您也无法知道其中有多少数据。代码是正确的,因为它完全按照您所说的做
除此之外,这一方针是毫无希望的误导。您究竟如何期望变量包含可从当前进程访问的有效内存位置
请解释为什么您认为输入到地址中的值是有效的、有意义的地址,然后也许我们可以解释为什么该假设无效
如果您的假设是您可以随意检查任何您想要的内存地址,那么这个假设是错误的,原因有两个。首先,出于安全原因,受保护模式处理器限制应用程序可用的内存。其次,内存地址通常是虚拟的,所以它甚至不是内存中的真实位置。尝试访问无效或受保护的位置将产生与您看到的位置类似的错误
最后,即使它是有效的,假设一个随机地址指向某个可以有意义地传递给printf()
(它需要一个有效的、以null结尾的字符串)的对象也是另一个错误的假设。代码是正确的,因为它完全按照您所说的做
除此之外,这一方针是毫无希望的误导。您究竟如何期望变量包含可从当前进程访问的有效内存位置
请解释为什么您认为输入到地址中的值是有效的、有意义的地址,然后也许我们可以解释为什么该假设无效
如果您的假设是您可以随意检查任何您想要的内存地址,那么这个假设是错误的,原因有两个。首先,出于安全原因,受保护模式处理器限制应用程序可用的内存。其次,内存地址通常是虚拟的,所以它甚至不是内存中的真实位置。尝试访问无效或受保护的位置将产生与您看到的位置类似的错误
最后,即使它是有效的,假设一个随机地址指向某个可以有意义地传递给printf()
(它需要一个有效的、以null结尾的字符串)的对象也是另一个错误的假设。下面的程序适合我。我相信这或多或少是你想要做的:
#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... */
}
#包括
#包括
内部主(空)
{
静态int数据=42;
静态int-bss;
int*pointer=malloc(sizeof*pointer);
puts(“一些提示:有”);
printf(“lib@%p\n”,printf);
printf(“文本@%p\n”,主);
printf(“数据@%p\n”和数据);
printf(“bss@%p\n”和&bss);
printf(“堆@%p\n”,指针);
printf(“堆栈@%p\n”和指针);
fputs(“地址:”,标准输出);
如果(scanf(“%p”,&指针)!=1)返回退出失败;
printf(“内存[%p]=%d\n”,指针,*指针);
返回EXIT_SUCCESS;/*如果仍处于活动状态*/
}
如果我离所提供的提示足够近的话,它甚至不会出错
请记住,尽管您可以在典型的PC上查看main()
或printf()
,但这并不能保证在任何地方都能正常工作。函数甚至可能与数据位于不同的地址空间。以下程序适用于我。我相信这或多或少是你想要做的:
#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... */
}
#包括
#包括
内部主(空)
{
静态int数据=42;
静态int-bss;
int*pointer=malloc(sizeof*pointer);
puts(“一些提示:有”);
printf(“lib@%p\n”,printf);
printf(“文本@%p\n”,主);
printf(“数据@%p\n”和数据);
printf(“bss@%p\n”和&bss);
printf(“堆@%p\n”,指针);
printf(“堆栈@%p\n”和指针);
fputs(“地址:”,标准输出);
如果(scanf(“%p”,&指针)!=1)返回退出失败;
printf(“内存[%p]=%d\n”,指针,*指针);
返回EXIT_SUCCESS;/*如果仍处于活动状态*/
}
如果我离所提供的提示足够近的话,它甚至不会出错
请记住,虽然您可以在典型的PC上浏览main()
或printf()
,但是