是否正在访问其绑定的未定义行为之外的全局数组?

桑蒂·桑蒂奇哈维金(Santi Santichaivekin)

今天我刚刚在班上做了一次考试---读取C代码和输入,并且所需的答案是如果程序实际运行将在屏幕上显示。声明a[4][4]为全局变量的问题之一,在该程序的某个点,它试图访问a[27][27],因此我回答了诸如“访问其边界之外的数组是未定义的行为”之类的问题,但是老师说a[27][27]它将具有的值0

之后,我尝试了一些代码来检查“所有未初始化的golbal变量都设置为0”是否正确。好吧,这似乎是真的。

所以现在我的问题是:

  • 似乎已清除并保留了一些额外的内存以供代码运行。保留多少内存?为什么编译器保留的内存比应有的多,它的用途是什么?
  • a[27][27]0所有环境?

编辑:

在该代码中,a[4][4]唯一声明的全局变量,并且中还有更多局部变量main()

在DevC ++中再次尝试了该代码他们都是0但这在VSE中是不正确的,0正如Vyktor指出的那样,在大多数VSE中,只有一些具有随机值。

没有人

您说对了:这是未定义的行为,您不能指望它总是在产生0

至于为什么在这种情况下看到零的原因:现代操作系统将内存分配给进程中相对粗粒度的块(称为页面),这些块比单个变量大得多(在x86上至少为4KB)。当您有一个全局变量时,它将位于页面上的某个位置。假设a类型为,int[][]并且ints为系统上的四个字节,a[27][27]则从的开头开始大约500个字节a因此,只要a在页面的开头附近,访问a[27][27]就会被实际的内存支持,并且读取它不会导致页面错误/访问冲突。

当然,您不能指望这一点。例如,如果a前面有将近4KB的其他全局变量,a[27][27]则将不由内存支持,并且当您尝试读取它时,过程将崩溃。

即使进程没有崩溃,您也不能指望获得该值0如果您在现代的多用户操作系统上有一个非常简单的程序,除了分配该变量并输出该值外什么也不做,您可能会看到0在将内存移交给进程时,操作系统会将内存内容设置为某个良性值(通常为全零),以使来自一个进程或用户的敏感数据不会泄漏到另一个进程或用户。

但是,不能完全保证读取的任意内存为零。您可以在未分配内存的情况下在平台上运行程序,并且会看到从上次使用开始碰到的任何值。

另外,如果a后面跟随着足够多的初始化为非零值的其他全局变量,则访问a[27][27]将向您显示那里恰好有任何值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将数组作为结构访问与未定义行为

来自分类Dev

是否使用联合未定义行为访问结构上的特定数组索引?

来自分类Dev

正在取消引用恒定的未定义行为

来自分类Dev

JavaScript:全局数组变量返回未定义

来自分类Dev

使用 FontLoader 函数未定义的全局数组

来自分类Dev

以下链接分配是否导致未定义行为?

来自分类Dev

是否缺少必需的包含未定义行为?

来自分类Dev

2D数组索引-未定义行为?

来自分类Dev

这是数组未定义行为的使用吗?

来自分类Dev

未定义行为的定义

来自分类Dev

const的未定义行为

来自分类Dev

未定义行为fopen,fclose

来自分类Dev

声明中的“未定义行为”?

来自分类Dev

正在通过const ref未定义行为捕获新构造的对象

来自分类Dev

JavaScript全局数组未定义,尽管它在警报中显示

来自分类Dev

C中未定义行为的副作用是否已定义?

来自分类Dev

访问静态超出范围的未定义行为吗?

来自分类Dev

将int作为unsigned long未定义行为进行访问吗?

来自分类Dev

访问多维数组的元素是否超出了未定义的行为范围?

来自分类Dev

如果计数大于类型的宽度,则右移是否为未定义行为?

来自分类Dev

是否取消引用等于nullptr的指针的标准未定义行为?

来自分类Dev

在C ++ 11中左移(<<)是否为负整数未定义行为?

来自分类Dev

是否使用成员函数作为构造函数的未定义行为的参数?

来自分类Dev

采取未初始化指针的地址是否为未定义行为?

来自分类Dev

是否从任何整数中减去INT_MIN视为未定义行为?

来自分类Dev

是否在未初始化值的字符串上未定义行为?

来自分类Dev

std :: sort-是否通过错误的比较器未定义行为?

来自分类Dev

在C ++中是否转换为simd类型的未定义行为?

来自分类Dev

将函数指针reinterpret_cast与void(*)()比较是否为未定义行为?

Related 相关文章

  1. 1

    将数组作为结构访问与未定义行为

  2. 2

    是否使用联合未定义行为访问结构上的特定数组索引?

  3. 3

    正在取消引用恒定的未定义行为

  4. 4

    JavaScript:全局数组变量返回未定义

  5. 5

    使用 FontLoader 函数未定义的全局数组

  6. 6

    以下链接分配是否导致未定义行为?

  7. 7

    是否缺少必需的包含未定义行为?

  8. 8

    2D数组索引-未定义行为?

  9. 9

    这是数组未定义行为的使用吗?

  10. 10

    未定义行为的定义

  11. 11

    const的未定义行为

  12. 12

    未定义行为fopen,fclose

  13. 13

    声明中的“未定义行为”?

  14. 14

    正在通过const ref未定义行为捕获新构造的对象

  15. 15

    JavaScript全局数组未定义,尽管它在警报中显示

  16. 16

    C中未定义行为的副作用是否已定义?

  17. 17

    访问静态超出范围的未定义行为吗?

  18. 18

    将int作为unsigned long未定义行为进行访问吗?

  19. 19

    访问多维数组的元素是否超出了未定义的行为范围?

  20. 20

    如果计数大于类型的宽度,则右移是否为未定义行为?

  21. 21

    是否取消引用等于nullptr的指针的标准未定义行为?

  22. 22

    在C ++ 11中左移(<<)是否为负整数未定义行为?

  23. 23

    是否使用成员函数作为构造函数的未定义行为的参数?

  24. 24

    采取未初始化指针的地址是否为未定义行为?

  25. 25

    是否从任何整数中减去INT_MIN视为未定义行为?

  26. 26

    是否在未初始化值的字符串上未定义行为?

  27. 27

    std :: sort-是否通过错误的比较器未定义行为?

  28. 28

    在C ++中是否转换为simd类型的未定义行为?

  29. 29

    将函数指针reinterpret_cast与void(*)()比较是否为未定义行为?

热门标签

归档