声明一个(未使用的)整数导致整个程序出现故障?

时间:2013-11-10 01:56:53

标签: c++ debugging variables

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

我这里的程序运行正常:

#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”是如何以某种方式阻止程序崩溃的。

3 个答案:

答案 0 :(得分:7)

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

您没有为elements指针分配任何内存。您尝试从此未初始化的指针访问十个元素。您的程序具有未定义的行为,即使它似乎有效也是错误的。

  

然而,我仍然不明白如何进入&#34; int size = 10&#34;不知何故   阻止程序崩溃。

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

答案 1 :(得分:1)

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

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

  int * elements;

声明指向int的指针。但是没有为整数数组分配空间。

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

答案 2 :(得分:1)

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

#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]时,不会执行任何检查。