In this code, for vector size, n >=32767, it gives segmentation fault, but upto 32766, it runs fine. What could be the error? This is full code.
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<utility>
#include<algorithm>
#include<sys/time.h>
using namespace std;
#define MAX 100000
bool compare(pair<int,int> p1,pair<int,int> p2) {
if(p1.second < p2.second)
return 1;
else if(p1.second > p2.second)
return 0;
if(p1.first <= p2.first)
return 1;
else
return 0;
}
int main() {
freopen("randomin.txt","r",stdin);
int n;
scanf("%d",&n);
vector< pair<int,int> > p(n);
for(int i=0;i<n;i++)
scanf("%d%d",&p[i].first,&p[i].second);
**printf("%d\n",(int)p.max_size()); // prints 536870911**
sort(p.begin(),p.begin()+n,compare);
//for(int i=0;i<n;i++)
//printf("%d %d\n",p[i].first,p[i].second);
printf("%.6f\n",(p[n-1].second+p[n-2].second)/(20.0+p[n-1].first+p[n-2].first));
return 0;
}
In practice, segfaults are almost always due to trying to read or write a non-existent array element, not properly defining a pointer before using it, or (in C programs) accidentally using a variable's value as an address (see the scanf example below).
It can be resolved by having a base condition to return from the recursive function. A pointer must point to valid memory before accessing it.
A segmentation fault occurs when your program attempts to access an area of memory that it is not allowed to access. In other words, when your program tries to access memory that is beyond the limits that the operating system allocated for your program.
What Is Segmentation Fault? In a nutshell, segmentation fault refers to errors due to a process's attempts to access memory regions that it shouldn't. When the kernel detects odd memory access behaviors, it terminates the process issuing a segmentation violation signal (SIGSEGV).
In C++, your compare
predicate must be a strict weak ordering. In particular, compare(X,X)
must return "false" for any X. In your compare function, if both pairs are identical, you hit the test (p1.first <= p2.first)
, and return true
. Therefore, this compare
predicate does not impose a strict weak ordering, and the result of passing it to sort
is undefined.
Try using all the values from n = 32766
up to 32770
. I suspect you'll find that you are experiencing some sort of overflow. This is because 2^15 (32768) is the biggest number that can be represented using 16 bits (assuming you also allow negative numbers). You will have to use a different data type.
Suggestion:
Get it to output the vector's maxsize:
cout << p.max_size();
Let us know what that does. All things being normal, I'd expect it to be in the hundreds of millions (536870911 on my computer). But if it's more like 32768, then that could be the problem.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With