Arrays 程序应该崩溃,但不会';T
根据我的理解,C\C++实际上没有对数组执行任何边界检查。这取决于操作系统,以确保您访问的是有效内存。所以这是未定义的行为 但在这里,我可以看到在不同的机器中,相同的行为是不变的。i、 e程序在任何时候都不会崩溃 但在这里,我可以看到在不同的机器中,相同的行为是不变的。i、 e程序在任何时候都不会崩溃 这里,崩溃(或分段故障)既不是期望的行为,也不是保证的行为,该行为是Arrays 程序应该崩溃,但不会';T,arrays,c,memory,undefined-behavior,Arrays,C,Memory,Undefined Behavior,根据我的理解,C\C++实际上没有对数组执行任何边界检查。这取决于操作系统,以确保您访问的是有效内存。所以这是未定义的行为 但在这里,我可以看到在不同的机器中,相同的行为是不变的。i、 e程序在任何时候都不会崩溃 但在这里,我可以看到在不同的机器中,相同的行为是不变的。i、 e程序在任何时候都不会崩溃 这里,崩溃(或分段故障)既不是期望的行为,也不是保证的行为,该行为是 这里的底线是,访问越界内存(即不属于进程地址空间的内存位置)是未定义的行为。有时带有UB的代码似乎工作得很好,没有任何分段错误
这里的底线是,访问越界内存(即不属于进程地址空间的内存位置)是未定义的行为。有时带有UB的代码似乎工作得很好,没有任何分段错误,产生了一些随机值,包括0,产生了“工作正常”的错觉,但事实并非如此 除了调用
abort()的程序外,C标准没有“应该崩溃”的程序概念代码>。编写C标准是为了允许实现以对编译器客户最有用的任何方式处理越界数组访问。根据客户试图实现的目标,最有用的行动方案可能是:
在编译器可以识别出正在发生越界访问的情况下的陷阱
扩展语言的语义,这样,如果程序员知道计算地址上的内容,代码就可以访问该对象,产生任何副作用[如果程序员不知道,代码无论如何都会访问它]
执行访问时不考虑其有效性,但不要考虑访问可能与程序执行的其他操作交互的可能性
在编写标准时,有三种方式的实现,以及三种方式中的每一种都最有用的程序。而不是试图判断哪种方法在任何特定情况下都是最好的,该标准的作者期望,任何希望出售编译器的人都会寻求以其客户认为最有用的方式处理代码——这一理念在关注客户利益的编译器作者推动语言趋势时效果良好。未定义的行为就像一盒巧克力--你永远不知道你会得到什么。。。。见:和
#include <stdio.h>
#define CHAR_ROW_SIZE 4
int charTable[CHAR_ROW_SIZE ][2] = {
{'X', 'Z'},
{'J', 'L'},
{'F', 'C'},
{'A', 'B'}
};
int main()
{
printf("char element %c\n", charTable[3][1]); //fine
printf("char element %c\n", charTable[3][8]); // accessing 4th row's 9th element which is not valid
printf("char element %c\n", charTable[85][0]);// accessing 86th row's first element which is not valid
return 0;
}
char element B
char element
char element