首页 > 解决方案 > 在 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 的代码,但它并没有在控制台中显示任何具有动态分配的结果,但它在使用静态数组时确实如此。

标签: c++dynamic

解决方案


该函数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

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


推荐阅读