2010-11-21 6 views
0
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); 

} 

ОК, ребята, когда я запустить эту программу, на самом деле, когда я называю этот метод, как этотстранная ошибка Сегментация C

mymalloc(testarray,50); 

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

+0

Запустить его? отлично, но могли бы вы тогда дать нам весь источник, который нам нужен? – steabert

ответ

0

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

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

+0

im фактически компилирует код с помощью шпатлевки на машине linux. файл сохраняется в общей папке. – shadow7

+0

и им просто редактировать его с помощью блокнота ++ с моей машины – shadow7

+0

проверить, доступны ли valgrind или gdb в вашей удаленной оболочке – Simone

0

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

+0

«проверьте, доступны ли valgrind или gdb в вашей удаленной оболочке» – shadow7

+0

как я могу проверить? – shadow7

+0

Вы ищете утечки памяти, правильно? В этом случае используйте valgrind. http://cs.ecs.baylor.edu/~donahoo/tools/valgrind/ – BastiBen