为什么这个指针/整数比较会产生分段错误?

时间:2011-06-22 12:08:09

标签: c++ pointers

我正在研究一个产生分段错误的程序,我无法理解为什么。如果我从“最低”和“最大”变量中删除指针声明并将它们用作无指针整数,程序运行正常。

但是,一旦我尝试使用指针,问题就出现了,我收到了分段错误。我意识到这可能是一个非常简单且解决得很好的问题,但我试图通过查看其他类似的问题来理解代码。我还没有找到解决问题的方法。我也不明白出了什么问题。

这是产生问题的代码(链接到完整源代码如下):

     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 << "\n\n";

 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

提前感谢此事!

6 个答案:

答案 0 :(得分:3)

int *largest = 0, *lowest = 0, sum = 0;

这是你的问题。您永远不会为这些分配内存或分配有效地址。当您取消引用NULL指针时,就像这里

一样
if(*i < *lowest) //lowest is NULL

你得到未定义的行为,包括分段错误,鼻子恶魔和其他任何东西

答案 1 :(得分:2)

它不起作用,因为它不比较指针。您正在比较存储在某些内存地址中的值,这些值很可能不属于您的程序,因此您将被SIGSEGV击落。

您无法访问不属于您的程序的内存。

答案 2 :(得分:1)

在您取消引用之前,

lowestlargest是否已初始化?如果最低值未指向有效地址,则使用*lowest将导致seg错误。

你可以尝试在开始的某个地方设置lowest = largest = numbers;。也许这会对你有帮助。

答案 3 :(得分:1)

您的编程使用无效内存(最低和最大指针)。 但是!

此代码中不需要指针

事实上,该程序具有不必要的复杂性。 为什么使用指针,何时可以使用索引?

您可能会发现您的分配/初始化错误。

 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;
 }

答案 4 :(得分:1)

您正在初始化最低&amp;最大值指针为0,然后在不将它们指向有效值的情况下取消引用它们。

int *largest = 0, *lowest = 0, sum = 0;

答案 5 :(得分:0)

您正在将最低值和最大值初始化为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