首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么下面的代码不会产生分段错误?

为什么下面的代码不会产生分段错误?
EN

Stack Overflow用户
提问于 2013-04-08 12:43:22
回答 5查看 432关注 0票数 1
代码语言:javascript
复制
#include <iostream>
using namespace std;

int a[4];
int main(){
    int b=7;
    cout<<a[b]<<endl;
    return 0;
}

我正在尝试访问未分配的内存。所以我希望输出是一个分段错误,而输出是一些无用的值。

后来,我将“b”增加到1000,现在输出是“分割错误”。这种行为有没有具体的原因呢?

我使用的是gcc-4.3.2编译器。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-04-08 12:46:12

如果您试图访问不存在的内存地址(进程地址空间之外的),则可能会抛出A segmentation fault

在这种情况下,a[7]可能不在其可访问空间之外,但a[1000]肯定是。但即使是前者也会在你最意想不到的时候爆炸;)

票数 6
EN

Stack Overflow用户

发布于 2013-04-08 12:45:21

只有当您访问操作系统不允许访问的内存时,才会发生分段故障。

但是,您可以访问已授予您的内存,例如,指向堆栈的较早或较晚的内存地址,尽管它不是您所期望的。但这不是你可以依赖的一致性,因为本地存储的变量如何放置在堆栈上是由编译器根据神秘的优化来决定的,这些优化将会有所不同-从调试到发布,随着代码的变化,等等。

但是,如果你曾经看到过类似这样的问题,“为什么访问这个变量会给我带来垃圾,但总是相同的垃圾?”您可能无意中偷看了堆栈中不应该看到的部分。

票数 2
EN

Stack Overflow用户

发布于 2013-04-08 12:45:32

它是未定义的行为,所以任何事情都可能发生,你就是不能说。查看 (对于C++),了解未定义行为、未指定行为和实现定义行为之间的区别。

附件J中的C- **ISO C9899**清楚地谈到了这一点。

编辑

C++ - N3485 ISO/IEC1.9.21.9.31.9.4一节中谈到了上述行为。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15871423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档