Функция malloc не работает должным образом в программе C. программа вылетает

Я новичок в C, и это моя первая программа, использующая функцию malloc(). Я думаю, что может возникнуть проблема с использованием этой функции. Я хотел использовать массив (длина цикла), где будет помещено решение для диапазона чисел (пользовательский ввод). поэтому размер массива зависит от пользователя, поэтому я использовал malloc(). но программа вылетает. Вот мой код:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int x,y,num,count,p,k;
    for(;;){
        printf("enter first integer. must be between 1 and 100000\n");
        scanf("%d", &x);
        printf("enter second integer. must be between 1 and 100000. must not equal the first integer.\n");
        scanf("%d", &y);
        if(x>=1 && x<100000 && y>=1 && y<100000 && x!=y){
            break;
        }
        else{
            printf("try the whole process again\n");
        }
    }
    if (x<y){
        int j;
        j=y;
        y=x;
        x=j;
    } //making x always greater than y
    int *cyclelength=malloc(5000*sizeof(int));
    if (NULL==cyclelength){
        printf("process aborted");
    }
    else{
        /*solution part for the range of number. and solution for each number  put into cyclelength.*/
        num=y;
        while(num<=x){
            p=1;
            k=num;
            while(k!=1){
                if(k%2==0)
                    k=k/2;
                else
                    k=3*k+1;
                p+=1;
                }
            count=0;
            cyclelength[count]=p;
            num+=1;
            count+=1;
        }
        free(cyclelength);
        cyclelength=NULL;
    }
    int c=0;
    int max=cyclelength[c];
    for(;c<x-y;c+=1){
        if(max<cyclelength[c+1]){
            max=cyclelength[c+1];
        }
    }
    printf("%d,%d,%d",x,y,max);
    return 0;
}

person Nasif Imtiaz Ohi    schedule 08.07.2012    source источник
comment
Вы должны опубликовать вывод о сбое с вопросом. Это поможет вам быстрее получить лучший ответ.   -  person cytinus    schedule 08.07.2012


Ответы (3)


Вы используете длину цикла после ее освобождения, поэтому ваша программа аварийно завершает работу.
Попробуйте следующее:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int x,y,num,count,p,k;
    for(;;){
        printf("enter first integer. must be between 1 and 100000\n");
        scanf("%d", &x);
        printf("enter second integer. must be between 1 and 100000. must not equal the first integer.\n");
        scanf("%d", &y);
        if(x>=1 && x<100000 && y>=1 && y<100000 && x!=y){
            break;
        }
        else{
            printf("try the whole process again\n");
        }
    }
    if (x<y){
        int j;
        j=y;
        y=x;
        x=j;
    } //making x always greater than y
    int *cyclelength=(int *)malloc(5000*sizeof(int));
    if (NULL==cyclelength){
        printf("process aborted");
    }
    else{
        /*solution part for the range of number. and solution for each number  put into cyclelength.*/
        num=y;
        while(num<=x){
            p=1;
            k=num;
            while(k!=1){
                if(k%2==0)
                    k=k/2;
                else
                    k=3*k+1;
                p+=1;
                }
            count=0;
            cyclelength[count]=p;
            num+=1;
            count+=1;
        }        
        // don't assign null to cyclelength
        //cyclelength=NULL;
    }
    int c=0;
    int max=cyclelength[c];
    for(;c<x-y;c+=1){
        if(max<cyclelength[c+1]){
            max=cyclelength[c+1];
        }
    }
    printf("%d,%d,%d",x,y,max);
    // free here
    free(cyclelength);
    return 0;
}
person Mahesh Meniya    schedule 08.07.2012
comment
ну... спасибо всем... у меня проблема с функцией malloc... в этом коде была еще одна проблема, связанная с объявлением переменной count... это была глупая ошибка. я прошу прощения за это. - person Nasif Imtiaz Ohi; 08.07.2012
comment
Вы также должны изменить эту строку int *cyclelength=malloc(5000*sizeof(int)); в int *cyclelength=(int *)malloc(5000*sizeof(int)); - person Mahesh Meniya; 08.07.2012

Вы вызываете free(cyclelength) и затем получаете доступ к памяти, на которую он указывает (или, скорее, к памяти, на которую он указывает).

(И ваша обработка ошибок могла бы немного улучшиться; вы печатаете "process aborted", но затем продолжаете обработку.)

person Keith Thompson    schedule 08.07.2012

Вы используете cyclelength после того, как freed установили для него значение NULL:

        free(cyclelength);
        cyclelength=NULL;
    }
    int c=0;
    int max=cyclelength[c];
    for(;c<x-y;c+=1){
        if(max<cyclelength[c+1]){
            max=cyclelength[c+1];
        }

Это неопределенное поведение, которое может привести к сбою.

person Daniel Fischer    schedule 08.07.2012