Why does this pointer/integer comparison generate a segmentation fault?
I am working on a program which generates a segmentation fault and I cannot understand why. If I remove the pointer declaration from "lowest" and "largest" variables and use them as pointerless integers the program works fine.
However, as soon as I try to use p开发者_Go百科ointers, problems arise and I receive a segmentation fault. I realize that this is probably a very easy and well addressed issue, but I've tried to understand the code by looking on other similar problems. I haven't found a solution for my problem yet. Nor do I understand what's going wrong.
This is the code generating the problem (link to full source is below):
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;
}
The i
variable points to an old reference which is declared after user input:
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;
}
}
Please explain to be why my program isn't working and what I am doing wrong. As I've said earlier everything works except the:
if(*i < *lowest)
lowest = i;
if(*i > *largest)
largest = i;
Full source: http://pastie.org/2105963
Thanks in advance on this matter!
int *largest = 0, *lowest = 0, sum = 0;
This is your problem. You never allocate memory or assign a valid address to these. And when you dereference a NULL pointer, like here
if(*i < *lowest) //lowest is NULL
you get Undefined Behavior, which includes segmentation fault, nasal demons, and anything else
It doesn't work, because it doesn't compare pointers. You are comparing the values stored at some memory addresses, which most likely don't belong to your program, therefore you are shot down by a SIGSEGV.
You can't access memory that doesn't belong to your program.
are lowest
and largest
initialized before you dereference them? Using *lowest
will cause a seg fault if lowest doesn't point to a valid address.
you can try setting lowest = largest = numbers;
somewhere at the start. Maybe that will help you.
You are initializing the lowest & largest value pointers to 0 then dereferencing them later without pointing them to a valid value.
int *largest = 0, *lowest = 0, sum = 0;
Your programming is using invalid memory (lowest and largest pointer). But !
Pointers are not necessary in this code
In fact the program has an unrequired complexity. Why using pointer, when you can use indices ?
You will problably found your allocation/initialisation error.
for(int index=0; index<arrLength; index++){
numbers[index] = rand() % range;
x = rand() % 2;
if(x > 0) {
numbers[index] = numbers[index] * -1;
}
}
You need only a pointer to create the array.
int *numbers = new int[arrayLength];
And finally your program will be simpler :
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;
}
You are initialising lowest and largest to 0 and the dereference is accessing memory via a null pointer and so it falls over. Try this instead:
if (!lowest || *i < *lowest)
lowest = i;
if (!largest || *i > *largest)
largest = i;
or:
int *numbers = new int[arrLength];
lowest = largers = numbers; // initialise to something non-null
精彩评论