为什么此指针/整数比较会生成分段错误
Why does this pointer/integer comparison generate a segmentation fault?
我正在开发一个程序,该程序会生成分段错误,我无法理解原因。如果我从"最低"answers"最大"变量中删除指针声明,并将它们用作无指针整数,则程序运行良好。
然而,当我尝试使用指针时,问题就出现了,并且我收到了分段错误。我意识到这可能是一个非常简单且解决得很好的问题,但我试图通过查看其他类似的问题来理解代码。我还没有找到解决我问题的办法。我也不明白出了什么问题。
这是产生问题的代码(下面是完整来源的链接):
cout << "This is the array containing the random numbers:n";
for(int *i=numbers; i != numbers + arrLength; i++) {
if((*i % 200) == 0 && *i > 200) {
cin.get();
cout << endl;
}
else
cout << *i << ' ';
// Get statistics
// In the continuation of getting, lowest, largest then adding to sum.
// THIS PART IS MAKING SEGMENTATION FAULT.
if(*i < *lowest)
lowest = i;
if(*i > *largest)
largest = i;
sum += *i;
}
i
变量指向用户输入后声明的旧引用:
cout << "You entered: " << arrLength << "nn";
int *numbers = new int[arrLength];
// Fill the array with random numbers
srand(time(NULL));
int x;
int range = 5001;
for(int index=0; index<arrLength; index++){
*(numbers + index) = rand() % range;
x = rand() % 2;
if(x > 0) {
*(numbers + index) = *(numbers + index) * -1;
}
}
请解释为什么我的程序不起作用,以及我做错了什么。正如我之前所说的,除了之外,其他一切都有效
if(*i < *lowest)
lowest = i;
if(*i > *largest)
largest = i;
完整来源:http://pastie.org/2105963
提前感谢!
int *largest = 0, *lowest = 0, sum = 0;
这是你的问题。您永远不会为它们分配内存或分配有效地址。当你取消引用一个NULL指针时,比如这里的
if(*i < *lowest) //lowest is NULL
您得到了Undefined Behavior,其中包括分段错误、鼻恶魔和其他任何
它不起作用,因为它不比较指针。您正在比较存储在某些内存地址上的值,这些地址很可能不属于您的程序,因此您会被SIGSEGV击落。
您无法访问不属于程序的内存。
在取消引用lowest
和largest
之前,它们是否已初始化?如果最低地址未指向有效地址,则使用*lowest
将导致seg故障。
您可以尝试在开始时的某个位置设置lowest = largest = numbers;
。也许这会对你有所帮助。
您正在初始化最低的&最大值指针指向0,然后稍后取消对它们的引用,而不将它们指向有效值。
int *largest = 0, *lowest = 0, sum = 0;
您的编程使用了无效内存(最小和最大指针)。但是
此代码中不需要指针
事实上,这个程序有一种不需要的复杂性。既然可以使用索引,为什么要使用指针?
您可能会发现您的分配/初始化错误。
for(int index=0; index<arrLength; index++){
numbers[index] = rand() % range;
x = rand() % 2;
if(x > 0) {
numbers[index] = numbers[index] * -1;
}
}
您只需要一个指针即可创建数组。
int *numbers = new int[arrayLength];
最后你的程序会更简单:
int lowest =numbers[0], largest = lowest;
for(int i=0; i < arrLength; i++) {
int ii = numbers[i ]; )
if((ii % 200) == 0 && ii > 200) {
cin.get();
cout << endl;
}
else
cout << ii << ' ';
if(ii < lowest)
lowest = ii;
if(ii > largest)
largest = ii;
sum += ii;
}
您正在将最低值和最大值初始化为0,并且解引用通过空指针访问内存,因此它失败了。试试这个:
if (!lowest || *i < *lowest)
lowest = i;
if (!largest || *i > *largest)
largest = i;
或:
int *numbers = new int[arrLength];
lowest = largers = numbers; // initialise to something non-null
- 在某些循环内使用vector.push_back时出现分段错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 当我的阵列太大时出现分段错误
- 分段错误当我试图运行程序时出错
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 尝试使用集合函数时出现分段错误
- 我无法缩小此分段错误的原因
- g++的分段错误(在NaN上使用to_string两次时)
- 我是如何在这段代码中出现分段错误的
- 创建结构的数组时遇到分段错误
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 在 c++ 中实现 Trie 时出现分段错误
- 为什么 fstream 在打开带有格式的文件时会导致分段错误?
- 为什么我遇到分段错误?
- 动态类的分段错误(家庭作业问题)
- 分段错误 - 读取初始化指针的数组
- 如何摆脱C ++中的分段错误错误?
- 使用 CTYPE 时出现分段错误
- 为什么代码给出分段错误?