Это простой код, просто чтобы проиллюстрировать проблему, с которой я имею дело.
Если вы дадите ввод n = 3 и введете элементы массива как 1, 2 ,3 и m = 0, программа вылетит!! !
Почему это так?? Проблема возникает из-за того, что последние 2 строки содержат функцию free().
Теперь мой вопрос: почему это происходит? Та же программа с тем же входом не падает, если удалить операторы free...
Пожалуйста, объясните мне. Является ли причиной возникновения указанной проблемы условное выделение памяти?? Если да, то почему?
Я не получаю никакой подсказки, более того, свободное (NULL) не должно вызывать никаких ошибок, насколько я знаю, поэтому проблема возникает, когда я пытаюсь освободить одну из выделенных памяти, особенно положительные в мой вклад...
Это мой код:
#include <stdlib.h>
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
printf("Enter elements into the array\n");
int arr[n];
int i;
for(i=0;i<n;)
{
printf("arr[%d] ? ",i);
scanf("%d",(arr+i));
if(i>0)
{
if(arr[i]<arr[i-1])
continue;
else
i++;
}
else
i++;
}
int m;
printf("m ? ");
scanf("%d",&m);
int j,flag=0;
int *positive,*negative;
int start,end;
start=arr[0];
end=arr[n-1];
if(start<0 && end<0)
{
negative=(int*)calloc((start*-1),sizeof(int));
positive=0;
}
else if(start<0 && end>0)
{
negative=(int*)calloc((start*-1),sizeof(int));
positive=(int*)calloc(end,sizeof(int));
}
else if(start>=0 && end >0)
{
negative=0;
positive=(int*)calloc(end,sizeof(int));
}
int p=0;
for(i=0;i<n;i++)
{
if(i==0)
p=-1;
else
p=i;
if(arr[i]<0)
negative[-arr[i]]=p;
else
positive[arr[i]]=p;
}
for(i=0;i<n;i++)
{
int num=m-arr[i];
if(negative!=0 && num<0 && negative[-num])
{
if(negative[-num]==-1)
j=0;
else
j=negative[-num];
printf("%d %d\n",i,j);
flag=1;
}
else if(positive!=0 && num>=0 && positive[num])
{
if(positive[num]==-1)
j=0;
else
j=positive[num];
printf("%d %d\n",i,j);
flag=1;
}
}
if(flag==0)
printf("NO SUCH i j EXISTS\n");
if(positive) free(positive);
if(negative) free(negative);
return 0;
}
Вот мой вывод:
positive
илиnegative
, даже если ониNULL
? Пробовали ли вы пройтись по коду построчно в отладчике, чтобы убедиться, что он ведет себя так, как должен? - person Some programmer dude   schedule 21.03.2019if(positive)
илиif(negative)
.free()
делает эту проверку самостоятельно. - person Barmar   schedule 21.03.2019end == 0
? Тогда ваши указатели будут неинициализированы. - person Some programmer dude   schedule 21.03.2019end
быть0
? Ваши блокиif
иelse if
обрабатывают толькоend < 0
иend > 0
, но неend == 0
. - person Barmar   schedule 21.03.2019