我想声明一个指针,让它保存一个自定义地址,然后为其分配一个值:
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 行始终有效。
最佳答案
3rd assumption would be that such an address must be unavailable,
这是正确的:在现代操作系统(都具有内存保护)上,您无法写入任意内存地址。
过去可以访问不使用虚拟内存的操作系统(例如 MS-DOS
)上的任何内存,但允许这样做通常是一个非常糟糕的主意——它允许随机程序破坏操作系统状态,并且需要非常频繁的重新启动。
but this doesn't make sense either, because line 4 works always, no matter the address I give or the type of the pointer.
您混淆了两个不同的操作:打印地址(无论该地址是什么都允许)和取消引用地址,即读取或修改存储的值位于地址(仅允许有效地址)。
区别类似于“你能打印地址吗?” (例如“123 Main Street,SomeTown,SomeCountry”)和“您可以进入该地址的房屋吗?” (上述地址不可能,因为地球上没有“某个国家”)。即使地址有效,例如“1600宾夕法尼亚大道西北,华盛顿特区20500”,您可能仍然不被允许进入。
关于c - 取消引用自定义内存地址时出现段错误 (C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52356881/