Code:
for(i=0;i<=numPoints;i++){
if(y[i]>=0 && y[i+1]<0){
change[numChange]=i;
numChange++;
}
else if(y[i]>0 && y[i+1]<=0){
Your other loops only went to
i < numPoints. With this loop, you are guaranteed to be 1 past the end of the array.
But then you make it worse:
How can you use i+1 if i is already at or past the maximum value for the array subscript??