我试图理解以下悖论:
我正在 64 位 Linux 上运行一个程序。那么程序运行在64位模式(AMD64的长模式的子模式)下,对吧? 但这种模式没有分段,只有分页。那么为什么下面的代码会产生段错误呢?
int main() {
int* ptr = (int*)0xABCDABCDABCD;
*ptr = 10;
return 0;
}
最佳答案
这被称为段错误,与底层分页技术无关。这意味着(通常)您尝试访问超出您允许的范围(您的段)的内存,它可能被称为 block 、 block 、节、memlim、xyzzy、plugh 或任何 em> 确实如此。
这与在 Java 中遇到 null 指针 异常非常相似,尽管该语言中没有“指针”:-)
早在 Intel 为我们提供原始 x86 芯片的分段架构之前,UNIX 中指示它的信号 (SIGSEGV) 就已经存在了。
关于c - 64 位 AMD64 模式下的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26683088/