声明两个名为a
当然是一个错误;如果您的编译器接受这个错误,那么它就坏了。我假设您的意思是,如果用另一个声明替换一个声明,仍然不会出现错误。
数组访问没有范围检查.在编译时,通常不知道数组的大小,而且即使是这样,语言也不需要检查。在运行时,检查会降低性能,这将违背C+不为不需要的东西付费的理念。因此,数组结束后的访问会给出未定义的行为,这要由程序员来确保它不会发生。
有时,无效的访问会导致分段错误,但这是不能保证的。通常,内存保护只应用于整个内存页,典型的页面大小为几千字节。有效内存页中的任何访问都不会被捕获。您访问的内存很有可能包含一些其他程序变量,或者调用堆栈的一部分,因此在其中写入内容可能会以您所能想象的任何方式影响程序的行为。
如果你想安全,你可以std::vector
,并且只使用它的at()
功能。这将检查索引,如果异常超出范围,则抛出异常。它还将为您管理内存分配,修复示例中的内存泄漏。