【发布时间】:2019-02-20 17:41:41
【问题描述】:
我想声明一个指针,让它持有一个自定义地址,然后给它赋值:
void main()
{
char *ptr;
ptr = (char *)0x123123; //the assignment works perfectly with a cast
printf("%p\n", ptr); //and the pointer indeed holds the address it's supposed to
*ptr = 'a'; //but this breaks
puts("2");
}
最初我认为原因是因为我试图取消引用未初始化的内存。但我实际上怀疑是不是这种情况,因为这个some_type *some_ptr = &some_variable; 完美无缺,所以这笔交易必须是我分配给它的地址。
然后我想,同样3或'a'或"alpine"是常量,(char *) 0x123123也必须是常量。 const-s 不能在 C 中编辑,但仍然不能这样,因为尝试更改 const 值将无法编译。
第三个假设是这样的地址一定不可用,但这也没有意义,因为第 4 行始终有效,无论我提供的地址或 pointer 的类型如何。
【问题讨论】:
-
你想做什么?你不能只写内存中的随机地址。
-
你怎么知道你的程序实际上拥有那个随机地址?每个进程都可以写入操作系统给定的内存位置。您不能将任意内容写入内存中的任意位置。
-
@tkausl 这正是我想要做的。
-
@eozd 在这种情况下,是否有可能找出操作系统将提供给程序的地址范围?它是否至少在理论上可以保证,写入该范围内的随机地址不会中断?
-
不能用
mprotect或virtualprotect/virtualquery给内存读写权限,然后再写入,重置内存保护吗?
标签: c pointers memory segmentation-fault memory-address