2015-08-10 4 views
0

В настоящее время я изучаю программирование c. Я написал этот код как часть задания и продолжаю получать ошибки сегментации. Прототипы:Необъяснимая ошибка сегментации (ядро сбрасывается)

#define ALLOC_ERROR -1 

typedef struct monom 
{ 
    int coefficient;  
    int power;   
} Monom; 

int insertNewMonom(Monom** polynom, int base, int power, unsigned int size); 
bool findPlace(Monom** polynom, int power, unsigned int size, int* place); 
void printPolyMul(Monom* polynom1, unsigned int polynom1Size, Monom* polynom2, unsigned int polynom2Size); 

Вот соответствующий код:

void printPolyMul(Monom* polynom1, unsigned int polynom1Size, Monom* polynom2, unsigned int polynom2Size) 
{ 
    Monom *mulPolynom = NULL, *temp = NULL; 
    unsigned int count = 0; 
    int i, j, size=0, base, power; 

    for(i=0; i<polynom1Size; i++){ 
     for(j=0; j<polynom2Size; j++){ 
     if(count==size){ 
      size = (size*2)+1; 
      temp = realloc (sumPolynom, size * sizeof *sumPolynom); 
      if(!temp){ 
       fprintf(stderr, "Allocation error\n"); 
       exit(ALLOC_ERROR); 
      } 
      else 
       sumPolynom = temp; 
     }      
     base = (polynom1[i].coefficient)*(polynom2[j].coefficient); 
     power = (polynom1[i].power)+(polynom2[j].power); 
     count += insertNewMonom(&mulPolynom, base, power, count); 
    } 
} 

temp = realloc (mulPolynom, count * sizeof *mulPolynom); 
if(!temp){ 
    fprintf(stderr, "Allocation Error\n"); 
    exit(ALLOC_ERROR); 
} 
else 
    mulPolynom = temp; 

printPolynom(mulPolynom, count);    
free(mulPolynom); 
} 
int insertNewMonom(Monom** polynom, int base, int power, unsigned int size) 
{ 
    int i, place; 
    bool new_flag; 
    Monom tempMonom; 

    tempMonom.coefficient = base; 
    tempMonom.power = power;  

    if(!base) 
     return 0; 
    new_flag = findPlace(polynom, power, size, &place); 
    if(new_flag){ 
     if(place==size){ 
      (*polynom)[place] = tempMonom; 
      return 1; 
     } 
     else{ 
      for(i=size; i>place; i--) 
       (*polynom)[i] = (*polynom)[i-1]; 
      (*polynom)[place] = tempMonom; 
      return 1; 
     } 
    } 
    else{ 
     polynom[place]->coefficient += base; 
     return 0; 
    } 
} 

bool findPlace(Monom** polynom, int power, unsigned int size, int* place) 
{ 
    int curr; 
    for(curr=0; curr<size; curr++){ 
     if(polynom[curr]->power==power){ 
      *place = curr; 
      return false; 
     } 
     if(polynom[curr]->power<power){ 
      if(curr)   
       *place = curr-1; 
      else 
       *place = curr; 
      return true; 
     } 
    } 
    *place = size; 
    return true; 
} 

мне удалось отследить точное место, где код аварии. Это когда bool findPlace(Monom** polynom, int power, unsigned int size, int* place) вызывается в третий раз, на втором для итерации (curr=1), когда проверяется polynom[curr]->power. Я упомянул, что был использован ранее оловянной программой для приема polynom1 и polynom2 и работал просто отлично.

+2

Не нужно бросать malloc в C http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc –

+0

Вы можете написать: 'mulPolynom = realloc (mulPolynom, размер * sizeof * mulPolynom) ' –

+0

@ ViktorSimkó это утечка в случае ошибки. – Quentin

ответ

1

Размер выделен слишком мал.

Рассмотрение size = polynom1Size*polynom2Size; realloc (mulPolynom, size * sizeof *mulPolynom); ... if(place==size){ (*polynom)[place] = tempMonom;.

Код пытается изменить элемент [size], но имеет только пространство для элементов 0,1,2, ... size-1.

Не углубляясь, оказывается realloc (mulPolynom, (size + 1) * sizeof *mulPolynom);.

+0

Я проверил этот аспект, логический размер всегда меньше размера pysical ... – AviadG

+0

Предложите записать функцию, которая будет использоваться внутри каждого '[foo (x, size)]' array, доступного для этого теста, если '0 <= x && x <размер'. Код скорее всего не подходит для 1) слишком маленькой памяти (этот ответ). 2) Доступ к массиву за пределы. (этот комментарий). BTW: Вы попробовали 'realloc (mulPolynom, (size + 1) * sizeof * mulPolynom)'? – chux

+0

Чтобы быть понятным, этот ответ не связан с _логическим размером___ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Речь идет о типичном полиномиальном представлении, которое обычно является индексом «0,1,2,3, N' и поэтому нуждается в элементах« N + 1 ». – chux

0

В insertNewMonom у вас есть заявления

(*polynom)[place] = tempMonom; 

Но tempMonom локальная переменная и перестает существовать, когда функция возвращает. Любая ссылка на нее позже будет либо вызывать мусор, либо выходить из строя.

+0

, но когда я пишу (* polyom) [place] = tempMonom, я действительно копирую его, поэтому позже мне не придется ссылаться на него, нет? – AviadG

Смежные вопросы