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