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

c++ Occasional Dynamic Pointer Crashing

我编写了一个程序来接收用户的浮点输入以创建一个动态数组(然后使用这些输入和函数来查找基本的东西,比如最大、最小、总和、平均,但这些东西工作正常所以我不' think Ill include here for purpose of not creating a code wall)。

大约一半的时间它都有效,虽然我对原因有一些理论,但我无法找到解决方案。

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

我的第一个想法是下面的部分是问题所在。我的 class 还没有真正了解我能记得的与 new 一起使用的符号(我假设它指的是字节,所以科学记数法可能会起作用)。我只是为了测试而尝试了 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 的崩溃程序。

Variable-length 数组在 C++ 实现中并未得到普遍支持,尽管您的编译器明确支持它们。根据您的描述,问题在于此代码:

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

您正在定义大小为 0 的 variable-length 数组。因此,虽然您为 UsrIn 分配了 20 个条目,但您没有为 Array 分配任何内存。 variable-length 数组的目的是分配给定大小的数组,其中直到 运行 时间才真正知道大小。根据您的其他代码,这里的情况并非如此。最简单的方法就是更改 Array 尺寸以匹配您的 UsrIn 尺寸,例如:

float Array[20];

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

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