c - 取消引用自定义内存地址时出现段错误 (C)

标签 c pointers memory segmentation-fault memory-address

我想声明一个指针,让它保存一个自定义地址,然后为其分配一个值:

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/

相关文章:

c++ - 赋值代码会不会导致crash?

c - 是 x=;而if(d<)在c语言中使用无效

c++ - unique_ptr - 无效指针和段错误

c - `pthread_t*` 的 `pthread_create` 参数需要存活多长时间?

c - 新手 C 程序员对错误感到好奇

c - C 中的 2D 数组指针访问段错误

memory - Blackberry - UI 堆栈中推送的最大屏幕数量

performance - 计算内存访问的平均时间

c - 如何关闭 GCC 中的所有优化

c - uint64 到 C 中的字符串