Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 通过int值访问地址_C_Memory - Fatal编程技术网

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()
,但是