Время от времени происходит сбой программы при использовании указателя free на условно выделенной памяти - PullRequest
2 голосов
/ 21 марта 2019

Это простой код, чтобы проиллюстрировать проблему, с которой я имею дело.

Если вы введете n = 3 и , введите элементы массива в виде 1, 2, 3 и m = 0 , программа аварийно завершится !! !

Почему это так ?? Проблема возникает из-за последних 2 строк, включающих free ()

Теперь мой вопрос: почему это происходит? Одна и та же программа с тем же вводом не падает, если удаляются свободные операторы ...

Пожалуйста, объясните мне. Это так, что условное выделение памяти вызывает указанную проблему ?? Если так, то почему?

Я не получаю никаких сигналов, более того, свободный (NULL) не должен вызывать никаких ошибок, насколько мне известно, поэтому проблема возникает, когда я пытаюсь освободить одну из выделенной памяти, особенно positive в моем входе ...

Это мой код:

#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;
}

Вот мой вывод:

enter image description here

1 Ответ

8 голосов
/ 21 марта 2019

С указанными вами входными значениями вы сначала делаете:

end=arr[n-1];
positive=(int*)calloc(end,sizeof(int));

Учитывая, что n == 3 и arr[n-1] == 3, вы выделяете массив 3 int с для positive.

В следующем цикле вы в итоге выполните:

positive[arr[i]]=p;

, который пытается перезаписать positive[3] (когда i == n-1).Это попытка записи за пределы массива (допустимые индексы варьируются от 0 до 2 только), и неопределенное поведение следует, означая, что после этой точки может произойти все что угодно, включая сбой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...