c++ - 为什么一个二维数组会导致段错误,而另一个不会?
问题描述
有几种方法可以定义二维数组。
我发现在使用下面的代码定义数组时:
int arr[2][2];
cout << arr[3][3];
这不会导致段错误。这只是打印一些虚拟值。
另一方面,
int** arr = new int*[2];
for(int i = 0; i < 2; i++) arr[i] = new int[2];
cout << arr[3][3];
这会导致段错误。
这些有什么区别?
解决方案
读取未初始化的值是未定义的行为。您的程序无效(两种变体)并且在您这样做时没有任何意义,并且允许任何行为。编译器实际上可以做任何事情。您无法推理包含 UB 的程序,甚至不要尝试。
推荐阅读
- c# - ASP.NET Core 3.1 启动时的日志记录
- angular - Angular 7.3如何从路由中获取数据
- java - JPQL,有没有办法过滤子集合而不过滤不满足条件的父集合?
- flutter - Flutter ListView 在手势上为项目设置动画
- excel - Excel: Conditional Formatting to colour Row based on two cells
- routing - SAPUI5 路由错误 找不到带有 ID 应用程序的控件
- r - 如何使用 R 直接从 Internet 下载 Excel 文件
- python-3.x - spacy 2.2.3 FileNotFoundError: [Errno 2] No such file or directory: 'thinc\\neural\\_custom_kernels.cu' in pyinstaller
- ruby - ruby 不能在 Windows 10 的所有目录中工作
- apache-kafka - Apache Kafka - KStream 和 KTable 硬盘空间要求