我尽可能地减少了我的代码,以便显示这种不断出现的奇怪错误。
我这里的程序运行正常:
#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”是如何以某种方式阻止程序崩溃的。
答案 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]
时,不会执行任何检查。