为什么不能将1个元素分配给2>尺寸动态标签?

时间:2018-11-01 18:50:22

标签: c++ pointers visual-c++

我的代码的简化版本如下:

int * tab = nullptr;
int index = 0;
int size = 1;   // Program works unless this is init'd to something higher!
int a = 0;

while (true)
{
    int input;
    std::cin >> input;

    if (input == 0) break;
    index++;

    if (index >= size) {
        size = size * 2;
        int * newt = new int[size];

        for (int i = 0; i < a; ++i)
            newt[i] = tab[i];

        delete[] tab;
        tab = newt;
    }
    tab[a] = input;
    a++;
}

每当我尝试将'size'整数更改为大于1时,程序就会崩溃。 Visual Studio大喊有关内存可访问性的问题,但我仍然无法弄清楚到底是什么问题。 我不必更改它,但是我一直在努力处理此代码超过一个小时,直到我不小心将变量更改为1,然后它才起作用。我很好奇为什么。

2 个答案:

答案 0 :(得分:3)

如果your_file_1.txt大于1,则size在第一次迭代中将不成立,导致index >= size指向某事物的代码均未执行,因此tab访问权限已损坏。

您的算法很难遵循,因此除了建议重新设计之外,我没有提出具体的解决方案。

答案 1 :(得分:2)

除了Lightness Races in Orbit

在这里,我对修订版的处理方式:

#include <iomanip>
#include <iostream>
#include <sstream>

int main()
{
  int *tab = nullptr;
  int len = 0, size = 0;
  std::stringstream in;
  in << "1 2 3 4 5 6 7 8 9 10 0";
  while (true)
  {
    int input;
    //std::cin >> input;
    in >> input;
    if (input == 0) break;
    if (len >= size) {
      size = std::max(2 * size, 1);
      int * newt = new int[size];
      for (int i = 0; i < len; ++i) newt[i] = tab[i];
      delete[] tab;
      tab = newt;
    }
    tab[len++] = input;
  }
  for (int i = 0; i < len; ++i) std::cout << ' ' << tab[i];
  std::cout << '\n';
  return 0;
}

输出:

 1 2 3 4 5 6 7 8 9 10

Live Demo on coliru

我必须承认,我仍然不明白为什么要破坏原始版本。 我尝试了 coliru ,它似乎运行良好(尽管我知道–运行良好并不意味着没有U.B.)。知道了。