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

问题描述:

我正在研究一个产生分段错误的程序,我不明白为什么。如果我从“最低”和“最大”变量中删除指针声明并将它们用作无指针整数,则该程序可以正常工作。为什么此指针/整数比较会产生分段错误?

但是,只要我尝试使用指针,就会出现问题,并收到分段错误。我意识到这可能是一个很容易解决的问题,但我试图通过查看其他类似问题来了解代码。我还没有找到解决我的问题。我也不明白发生了什么问题。

这是代码生成所述问题(链接到完整的源是下面):

 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

在此先感谢对此事!

+0

为什么要使用复杂指针运算,而不是使用数组访问运算符'[指数]'的? – knittl

+0

@ knittl:这可能是C++的作业,教授正在教他们指针算术。 – 2011-06-22 12:12:46

您初始化最低,规模最大的为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 
+0

谢谢,现在它工作完美,我明白我做错了什么。 :) – Ms01

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

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

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

这是你的问题。您永远不会分配内存或为其分配有效地址。而当你提领一空指针,喜欢这里

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

你未定义行为,其中包括分段错误,鼻恶魔,和其他任何

+0

谢谢,现在它工作完美,我明白我做错了什么。 :) – Ms01

lowestlargest你之前解引用它们初始化?如果最低点不指向有效地址,则使用*lowest将导致段错误。

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

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

指针是没有必要在此代码

事实上,程序有一个不需要的复杂性。 为什么使用指针,当你可以使用索引?

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

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

我必须使用指针为我的任务。 – Ms01

要初始化最低&最大价值的指针为0,然后再解引用他们不将它们指向一个有效的值。

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