c++ - 在 C++ 中如何为数组分配大小?
问题描述
如果我们用 4 个元素初始化数组,例如:
int array[4];
我们可以像这样分配值吗,因为它也需要 4 个值:
for(int i=5;i<9;i++){
cin>>array[i];
}
解决方案
对数组的越界访问具有未定义的行为,这是“意外后果”的另一种说法:
int a[4];
int b[4];
for(int i=5;i<9;i++){
a[i] = i;
}
在调试器中观察它在做什么,特别是观察b
.
这可能会或可能不会崩溃,但它仍然是损坏的代码。C++ 不会总是提醒您这种情况,作为开发人员,您有责任了解在访问某些结构时允许和不允许什么。
越界访问数组并不总是会导致崩溃,但它总是会出现问题。试试i = 999999
ori = -9
看看会发生什么。
未定义行为的问题在于它可能看起来有效,但这些意想不到的后果最终会赶上你。这使得调试代码变得非常困难,因为这种越界写入可能会在最初的错误发生几分钟或几小时后在其他地方踩到你需要的变量,然后你的程序崩溃。这类错误是最令人恼火的,因为因果之间的时间非常长。
这就像把点燃的火柴扔进垃圾箱可能不会每次都引起火灾一样,但当它确实引起火灾时,你可能不会注意到,直到为时已晚。在 C++ 中,您必须非常警惕不要在代码中引入未定义的行为。
推荐阅读
- sql-server - TypeORM 和 SQL Server - 在主键上设置 `NONCLUSTERED` 和 `NOT ENFORCED`
- python - 为什么 pandas fillna() inplace 不适用于多列?
- python - TensorFlow 可变长度时间序列训练误差与批量大小
- html - 如何更改引导程序中选择选项的宽度
- javascript - 在哪里放置外部 JS 文件以执行 DOM 操作
- android - 如何使用 RSS Feed URL 构建 Intent 以打开 Podcast 应用程序?
- python - 保存 keras 模型时出现错误“无法腌制”
- linkedin - LinkedIn 的organizationEntityFollowerStatistics API 的结果中是否仍包含旧版地理位置 (urn:li:region:[id])?
- c# - 将 Newtonsoft 与 MongoDB 一起使用
- django - Django 3.2 基本模板失败并出现错误:第 11 行的块标记无效:“原始”。您是否忘记注册或加载此标签?