C++ 为什么指针/整数比较会产生分段错误?
我正在编写一个程序,该程序会产生分段错误,我无法理解原因。如果我从“最小”和“最大”变量中删除指针声明,并将它们用作无指针整数,则程序运行良好 然而,当我尝试使用指针时,问题就出现了,我收到了一个分段错误。我意识到这可能是一个非常容易解决的问题,但我通过查看其他类似问题来理解代码。我还没有找到解决问题的办法。我也不明白出了什么问题 这是产生问题的代码(下面是指向完整源代码的链接): 请解释为什么我的程序不起作用,我做错了什么。正如我前面所说的,除了:C++ 为什么指针/整数比较会产生分段错误?,c++,pointers,C++,Pointers,我正在编写一个程序,该程序会产生分段错误,我无法理解原因。如果我从“最小”和“最大”变量中删除指针声明,并将它们用作无指针整数,则程序运行良好 然而,当我尝试使用指针时,问题就出现了,我收到了一个分段错误。我意识到这可能是一个非常容易解决的问题,但我通过查看其他类似问题来理解代码。我还没有找到解决问题的办法。我也不明白出了什么问题 这是产生问题的代码(下面是指向完整源代码的链接): 请解释为什么我的程序不起作用,我做错了什么。正如我前面所说的,除了: if(*i < *lowest)
if(*i < *lowest)
lowest = i;
if(*i > *largest)
largest = i;
if(*i<*最低)
最低=i;
如果(*i>*最大)
最大=i;
完整资料来源:
对这件事提前表示感谢 它不起作用,因为它不比较指针。您正在比较存储在某些内存地址的值,这些地址很可能不属于您的程序,因此您被SIGSEGV击落 您无法访问不属于您的程序的内存
int *largest = 0, *lowest = 0, sum = 0;
这是你的问题。您从未分配内存或为其分配有效地址。当你去引用一个空指针时,就像这里
if(*i < *lowest) //lowest is NULL
if(*i<*lowest)//lowest为空
您会得到未定义的行为,包括分段错误、鼻魔和任何其他在取消引用它们之前是否初始化了
最低的和最大的?如果LOWER未指向有效地址,则使用*LOWER
将导致seg故障
您可以尝试设置最低=最大=数字代码>开始的某个地方。这可能会对您有所帮助。您的编程正在使用无效内存(最小和最大指针)。
但是
此代码中不需要指针
事实上,这个程序有一种不必要的复杂性。
既然可以使用索引,为什么还要使用指针
您可能会发现分配/初始化错误
for(int index=0; index<arrLength; index++){
numbers[index] = rand() % range;
x = rand() % 2;
if(x > 0) {
numbers[index] = numbers[index] * -1;
}
}
最后,您的程序将更简单:
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;
}
int-lowest=数字[0],最大值=最低值;
for(int i=0;i200){
cin.get();
cout您正在初始化指向0的最小值和最大值指针,然后在不将它们指向有效值的情况下取消对它们的引用
int *largest = 0, *lowest = 0, sum = 0;
您正在将“最低”和“最大”初始化为0,而取消引用是通过空指针访问内存,因此它将被忽略。请尝试以下操作:
if (!lowest || *i < *lowest)
lowest = i;
if (!largest || *i > *largest)
largest = i;
为什么你使用复杂的指针算法而不是使用数组访问操作符<代码> [索引] <代码>?@ KNITTL:这可能是C++作业,教授正在教指针算法。谢谢,现在它工作得很好,我理解我做错了什么。谢谢:现在它工作得很好,我明白我做错了什么。
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;
}
int *largest = 0, *lowest = 0, sum = 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