如何使用c编程将值存储到特定的内存地址中

如何使用c编程将值存储到特定的内存地址中,c,pointers,memory,C,Pointers,Memory,我想像指针一样将一些值存储到特定的内存地址中。 我的代码: int i = 10; printf("i address %p\n", &i); // i address, for example, 0x7fff5d9b5478. It may differ from your system. //I use this address and assign to pointer p. p = (int *)0x7fff5d06d478; // print out p address,

我想像指针一样将一些值存储到特定的内存地址中。 我的代码:

int i = 10;
printf("i address %p\n", &i);
// i address, for example, 0x7fff5d9b5478. It may differ from your system. 

//I use this address and assign to pointer p.
p = (int *)0x7fff5d06d478;
// print out p address, make sure it is the i's address.
printf( "p %p\n", p);
// I assign value 0x100 to pointer p.
*p = 0x100;
// it thows me segmentation fault.
printf( "p %p\n", p);
return 0;
我想知道为什么最后一步它让我犯了错误。是因为我想访问一些非法内存吗?如果是,它在哪里?如何修复它

我想知道为什么最后一步它让我犯了错误

由于我看到您硬编码了地址,我假设您这样做:

  • 让程序打印某个对象的地址(
    i
  • 存储地址并在不同的过程中使用它
这是错误的:地址仅在原始地址空间中具有含义。在第二个过程中使用它没有什么意义,而且肯定没有定义


一个简单的实验方法是打印地址,然后在相同的过程中从用户那里读回地址(或略大/略小的值)。有人可能会说,这只是使用指针算法的一种低效替代方法,他们是对的。然而,这将是一种有效的方式来证明地址不是神奇的,只是数字



另一种试验方法是禁用地址空间随机化。这将使对象始终具有您可以轻松预测的相同地址。

此地址空间不属于此过程

大宗报价 “分段”一词在计算中有多种用途;在“分段错误”(segmentation fault)的上下文中,该术语自20世纪50年代开始使用,它指的是程序的地址空间。[需要引用]在内存保护的情况下,只有程序的地址空间是可读的,其中只有程序的堆栈和数据段的读写部分是可写的,而只读数据和代码段不可写。因此,尝试读取程序地址空间之外的内容,或写入地址空间的只读段,会导致分段错误,因此得名。 大宗报价


地址在不同的运行中有所不同。您使用的值可能是您第一次运行程序时看到的打印值,之后该地址可能是非法的。您使用的是什么操作系统?如果它有虚拟内存和具有不同访问权限的进程,操作系统将阻止它。你想实现什么?有些操作系统使用了一种方法来阻止恒定的“神奇”地址工作,使黑客的生活更加困难。地址各不相同。我只想知道我可以访问的有效地址。这就是我打印&I地址并将其用作指针地址的原因。我只是想实现将一些特定的内存地址存储到指针。@请您解释一下这个答案有什么问题吗?:)