3

我已经尽可能地减少了我的代码,以显示这个不断出现的奇怪错误。

我这里有一个运行良好的程序:

#include <iostream>
using namespace std;
int main() {
    int * elements;
    // int size = 10;
    for(int i = 0; i < 10; i++) {
        elements[i] = 0;
    }
    for(int i = 0; i < 10; i++) {
        cout << "Hi";
    }
    return 0;
}

但是,一旦我取消注释注释行,一切都会崩溃。什么都没有打印,Windows 出现一个错误,指出程序已停止响应。更改变量名不会影响程序。

这是我以前从未见过的奇怪错误。如果有人可以提供某种帮助,将不胜感激。

编辑:我现在看到我忘记为元素分配内存。但是,我仍然不明白如何输入“int size = 10”以某种方式阻止程序崩溃。

4

3 回答 3

7

未使用的整数与您的问题无关。

您没有为elements指针分配任何内存。您尝试从这个未初始化的指针访问十个元素。你的程序有未定义的行为,即使它看起来可以工作也是错误的。

但是,我仍然不明白如何输入“int size = 10”以某种方式阻止程序崩溃。

未定义的行为意味着任何事情都可能发生,并且看似无害的代码片段可能会导致您的程序具有不同的行为,即使这些代码片段与实际的违规代码没有明显关系。这就是该行为被称为“未定义”的原因。

于 2013-11-10T01:59:57.357 回答
1

注释掉的int内容与您的错误无关。

您没有为elements指针(数组)分配任何内存:

  int * elements;

这声明了一个指向int. 但是没有为整数数组分配空间。

访问你不拥有的内存是未定义的行为

于 2013-11-10T01:59:03.103 回答
1

您忘记分配内存来存储元素。结果,您访问未正确准备的内存并获得未定义的行为,任何事情都可能发生。您应该考虑使用vectors 代替,它比指针更容易和更安全。

#include <iostream>
#include <vector>  //  You must include this to get vectors
using namespace std;
int main() {
    vector<int> elements(10); // to create space for 10 ints
    // int size = 10;
    for(int i = 0; i < 10; i++) {
        elements[i] = 0;
    }
    for(int i = 0; i < 10; i++) {
        cout << "Hi";
    }
    return 0;
}

此外,使用elements.at(i) = 10代替更安全elements[i] = 10,因为它at会自动检查向量的大小并确保它足够大。使用[i],不执行检查。

于 2013-11-10T02:00:14.757 回答