странная ошибка сегментации в C - PullRequest
0 голосов
/ 21 ноября 2010
int * mymalloc(int *array, int size){

    //PRINTS THE TIMES MYMALLOC IS CALLED. JUST FOR TESTING;
    printf("~~~~~~~~~~~~~~~TIME(S) MYMALLOC WAS CALLED:~~~~~~~~~~~~~~~ %d\n", i++);

    //checks
    if(size<1){
        printf("SIZE NOT VALID\n");
        return (int *) 0;
    }

    printf("MEMORY FREE JUST WHEN MYMALLOC() IS CALLED: %d\n", (*((BLOCK *)array[0])).size);

    BLOCK currentHeader = (*((BLOCK *)array[0]));

    do{
    printf("CURRENT HEADER STATUS: %d\n", currentHeader.status);
        if(currentHeader.status == 0){
            printf("ok\n");
            if(currentHeader.size >= size){

                currentHeader.status = 1;

                if(currentHeader.size - size < sizeof(currentHeader))
                    return &array[currentHeader.data];

                else{

                    BLOCK nextHeader;

                    array[size + currentHeader.data] =  (int)&nextHeader; 

                    if(currentHeader.nextb !=0){

                        (*currentHeader.nextb).previousb = &nextHeader;
                        nextHeader.nextb = currentHeader.nextb;
                    }

                    currentHeader.nextb = &nextHeader;
                    nextHeader.previousb = &currentHeader;

                    nextHeader.size = currentHeader.size - size - sizeof(nextHeader);//here?

                    nextHeader.data = currentHeader.data + size + sizeof(nextHeader); //here?
                    printf("NEXT HEADER DATA: %d\n", nextHeader.data );

                    nextHeader.status = 0;
                    currentHeader.size = size; //changing the currentHeader.size to the "size" given.

                    printf("%d\n", sizeof(currentHeader));
                    printf("%d\n", size + currentHeader.data);
                    printf("%d\n", nextHeader.size);


                    printf("i return\n");

                    return &array[currentHeader.data];


                }
            }
            //printf("NOT ENOUGH SIZE");
        }

        if(currentHeader.nextb !=0){
            printf("%d\n",*currentHeader.nextb);
            currentHeader = *currentHeader.nextb;

        }

    }while (currentHeader.nextb != 0);

    return (int *) 0;
     //printf("%d\n", (*((BLOCK *)array[0])).status ); 

}

хорошо, ребята, когда я запускаю эту программу, на самом деле, когда я вызываю этот метод, как это

mymalloc(testarray,50);

когда я комментирую строку printf("ok\n"); я получаю ошибку сегментации.
Я имею в виду, что это просто функция printf. как это может повлиять на память ??????
Вы можете скопировать вставить его на свои машины и попробовать?
сначала с printf("ok\n");
тогда //printf("ok\n");

Ответы [ 2 ]

0 голосов
/ 21 ноября 2010

Вместо того, чтобы делать это «вручную». Я предлагаю использовать для этого подходящий инструмент, такой как valgrind или gprof.

0 голосов
/ 21 ноября 2010

если вы прокомментируете эту строку и она рухнет, это означает, что ваш стек поврежден. Таким образом, авария может появляться и / или исчезать без какой-либо видимой причины в любой «случайной» точке (конечно, это не совсем случайно, но так может показаться).

Можете ли вы сгенерировать дампы ядра и / или запустить его с помощью valgrind и / или пошагово отладить его?

...