在c++中使用动态分配的问题

Problem with using dynamic allocation in c++

本文关键字:动态分配 问题 c++      更新时间:2023-10-16
#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;
}

我绑定了D.R.Kaprekar的代码Self Number,但它在具有动态分配的控制台中没有显示任何结果,但在使用静态数组时显示了任何结果。

您在函数中遇到的问题

int d(int num) {
int dn = num;
while (num != 0) {
dn += num % 10;
num = num / 10;
}
return dn;
}

由于开始时dn=num,返回的walue不小于num。您不想在开始时将dn设置为零吗?

函数d使用返回值

d(0) == 0

d(i) > i, for i != 0

这条线路

arr[d(i)] = 0;

导致未定义的行为,因为索引超出了界限。在这个代码示例中,您可以看到,尽管这个数组的大小是3,但如何访问arr[4]

#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

未定义的bevahior可以将自己表达为崩溃、看似正确的代码或其他任何东西。