c ++偶尔的动态指针崩溃

时间:2018-04-10 15:22:41

标签: pointers dynamic while-loop crash

我已经创建了一个程序来接受来自用户的浮点输入以创建动态数组(然后使用那些带有函数的输入来查找基本的东西,如max,min,sum,avg但是那些东西工作得很好所以我不这样做为了不创建代码墙,我认为Ill包含在这里。

它的工作时间大约是一半时间,虽然我有一些关于原因的理论但我无法解决问题。

int main() {
     int Counter = 0;
     float *UsrIn = nullptr;
     float Array[Counter];

我的第一个想法是下面的部分是问题。我的班级并没有真正考虑使用我记忆中的新符号(我假设它指的是字节,所以也许科学符号可以工作)。我只是为了测试而尝试了20,它似乎工作(事后看来可能是一个愚蠢的假设)。

    UsrIn = new float[(int)20];
cout << "Enter float numbers:" << endl;
cout << "Enter '9999999' to quit:" << endl;
    cin >> *UsrIn;                  // User Input for pointer Dynamic Array
    Array[Counter] = *UsrIn;

while(*UsrIn!=9999999)              // User Input for Dynamic Array
    {
    Counter++;
    UsrIn++;
    cin >> *UsrIn;
    Array[Counter] = *UsrIn;
    }
delete UsrIn;
delete[] UsrIn;

我的另一个想法是,指针地址可能已被其他东西使用,或者它可能在某种程度上无效。我不知道有哪种方法可以测试,因为我偶尔会在进入“9999999”后退出while循环时发生崩溃

作为附注,我没有收到任何警告或错误消息只是来自eclipse的崩溃程序。

1 个答案:

答案 0 :(得分:0)

C ++实现中并不普遍支持可变长度数组,尽管您的编译器明确支持它们。根据您的描述,问题在于以下代码:

int main() {
     int Counter = 0;
     float *UsrIn = nullptr;
     float Array[Counter];

您正在定义一个大小为0的可变长度数组。因此,虽然您为UsrIn分配了20个条目,但您没有为Array分配任何内存。可变长度数组的目的是分配给定大小的数组,其中直到运行时才实际知道该大小。根据您的其他代码,这不是真正的情况。最简单的方法是将Array大小更改为与UsrIn大小匹配,例如:

float Array[20];

如果您真的想要更多动态行为,可以使用std::vector<float>

std::vector<float> Array;
...
Array.push_back(*UsrIn);