我正在进行一些调试,发现编译器分配的内存多于所需内存。在我的例子中,我声明了一个整数后跟一个字符串'name [10]'。即使我刚刚提到过10,我也可以插入超过10个字母。此外,我能够打印所有这些字符。并且我注意到限制不是10但是它是28.在28之后插入的字符没有显示。有人可以向我解释为什么会这样吗?
答案 0 :(得分:4)
它没有为该变量分配更多的内存,你恰好能够写入它旁边的内存的某些部分,但通过这样做,你可能会覆盖其他变量,甚至是你不喜欢的变量。 t控制,如调用堆栈,或由内存管理器本身创建的控制变量。
写你不应该的地方会调用未定义的行为,这意味着它可能会或可能不会起作用,可能会或可能不会产生后果。
其中一个后果被称为stack buffer overflow,这是一个安全漏洞,允许任意代码运行,并被蠕虫和漏洞利用广泛用于入侵计算机系统。
答案 1 :(得分:1)
C不会对数组访问进行边界检查,因此当您访问数组边界外的某些内容时,它不会自动引发异常。如果您没有破坏任何“重要”(例如返回地址),您的代码将不会立即崩溃,并且可能看起来正常运行。
C假设您知道阵列的大小,并且您足够聪明,不会在它们之外徘徊。
答案 2 :(得分:0)
大多数系统(CPU架构/操作系统/编译器组合)以不小于单个页面的分辨率为进程分配内存,通常至少为4KB。如果你的10个字节的分配在页面的开头结束,你可能能够读取和写入最后4,086个字节,而不会导致页面错误(稍微或多或少取决于填充,元数据等)