c++ - 在 C++ 中使用动态分配的问题
问题描述
#include<iostream>
using namespace std;
int d(int num) {
int dn = num;
while (num != 0) {
dn += num % 10;
num = num / 10;
}
return dn;
}
int main() {
int* arr = new int[10000];
for (int i = 0; i < 10000; i++) {
arr[i] = i + 1;
}
for (int i = 0; i < 10000; i++) {
arr[d(i)] = 0;
}
for (int i = 0; i < 10000; i++) {
if (arr[i] > 0) {
cout << arr[i]-1<<endl;
}
}
delete[] arr;
return 0;
}
我正在编写 DR Kaprekar 的 Self Number 的代码,但它并没有在控制台中显示任何具有动态分配的结果,但它在使用静态数组时确实如此。
解决方案
该函数d
返回值
d(0) == 0
和
d(i) > i, for i != 0
这条线
arr[d(i)] = 0;
导致未定义的行为,因为索引超出范围。在此代码示例中,您可以看到,arr[4]
尽管此数组的大小为3
.
#include<iostream>
int d(int num) {
int dn = num;
while (num != 0) {
dn += num % 10;
num = num / 10;
}
return dn;
}
int main() {
constexpr unsigned int s = 3;
int arr[s];
for (unsigned int i = 0; i < s; i++) {
arr[i] = i + 1;
}
for (unsigned int i = 0; i < s; i++) {
arr[d(i)] = 0;
std::cout << "d(" << i << "): " << d(i) << '\n';
}
for (unsigned int i = 0; i < s; i++) {
if (arr[i] > 0) {
std::cout << arr[i] - 1 << '\n';
}
}
return 0;
}
输出:
d(0): 0
d(1): 2
d(2): 4
1
未定义的行为可以将自己表达为崩溃、看似正确的代码或其他任何东西。
推荐阅读
- android - 单个 concatArrayEager 不订阅所有源
- node.js - Flatmap-stream 有恶意提交,因此被删除。现在我无法运行我的网站,因为它是一个依赖项。关于我应该做什么的任何提示?
- r - 在组内总结 dplyr
- c# - SQL Server:在表更新时创建大于 8060 字节的行
- google-cloud-datastore - Spring+GCP Datastore:我使用存储库,并希望在开发或测试期间将其配置为使用数据存储模拟器
- javascript - 是否可以检测到基类中调用 super() 的类?
- java - 如何将实体分布在 Spring-data-jpa 和 eclipselink 中的不同模块上?
- machine-learning - 如何在相机以外的其他传感器上使用 SLAM?
- mysql - mysql查询中的CASE函数
- ms-access - MSAccess - 清除多选列表框,移动到顶行,未选中