2017-01-20 2 views
-1

моя функция получает два существующих массива (+ размеры) и указатель, которые в функции строят новый массив и realloc размер в конце. , наконец, функция возвращает новый размер, но printf нового массива сбой. Алгоритм работы корпуса нового размера действительно прав.Проблемы с realloc и array

int UniteArray(int *a,int sizeA,int *b,int sizeB,int *tempArray) 
{ 
    int i=0,j=0,counter=0; 
    tempArray=(int*)malloc(sizeA*sizeof(int)); 
    while (i<sizeA) 
     { 
      if (a[i]==b[j]) 
       { 
        tempArray[counter++]=a[i]; 
        i++;j++; 
       } 
      else if (a[i]<b[j]) 
       i++; 
      else if (b[j]<a[i]) 
       j++; 

     } 
    tempArray=(int*)realloc(tempArray,counter); 
    return counter; 
} 

здесь вызов функции;

void Ex3() 
{ 
    int *a,*b,*unite; 
    int sizeA,sizeB,newSize,counter,i; 

    a=BuildArray(&sizeA);//Build the A array. 
    b=BuildArray(&sizeB);   //Build the B array.          
    merge_sort(a,0,sizeA-1);//merge the A array. 
    merge_sort(b,0,sizeB-1);   //merge the B array. 

    counter=UniteArray(a,sizeA,b,sizeB,&unite); //<<<<<<< HERE 
    printf ("The new Length: %d.\n",counter); 
    for (i=0;i<counter;i++) 
     printf ("%d ",unite[i]); 
+1

Таким образом, вы игнорируете предупреждения компилятора (или используете древний компилятор), но знаете, почему ваш код не работает. В следующий раз включите все рекомендуемые предупреждения, скопируйте код без предупреждения и используйте отладчик. И узнайте, что такое локальные переменные. Это должно было быть первым в вашей книге или уроке. Если последнее: сообщите своему учителю, чтобы он уточнил о локальных переменных и пошаговой стоимости. – Olaf

+0

* Ahem * Чтобы сделать это немного более аккуратно ... OP, вам нужно включить полный текст ошибки в свой вопрос. Мы действительно не можем помочь вам с «он разбился» или «произошла ошибка». Если это «ошибка сегментации», вам может понадобиться использовать другой инструмент для поиска причины. См. [Этот вопрос и ответ] (http://stackoverflow.com/q/33047452/472647) для получения дополнительной информации о segfaults. – CodeMouse92

ответ

3

Вы проходите int ** для пятого параметра UniteArray, но функция ожидает int *. Хотя они оба указатели, они не то же самое. Ваш компилятор должен был предупредить вас об этом.

Вам необходимо изменить вашу функцию, чтобы принять int ** и соответствующим образом изменить ссылки на tempArray. Кроме того, вы не перераспределяете достаточно памяти. Вам нужно умножить счетчик на sizeof(int).

int UniteArray(int *a,int sizeA,int *b,int sizeB,int **tempArray) 
{ 
    int i=0,j=0,counter=0; 
    *tempArray=malloc(sizeA*sizeof(int)); 
    while (i<sizeA) 
     { 
      if (a[i]==b[j]) 
       { 
        (*tempArray)[counter++]=a[i]; 
        i++;j++; 
       } 
      else if (a[i]<b[j]) 
       i++; 
      else if (b[j]<a[i]) 
       j++; 

     } 
    *tempArray=realloc(*tempArray,counter*sizeof(int)); 
    return counter; 
} 
+0

FIXED спасибо! –

+0

@NaorMalca подтвердите ответ, если он вам поможет. – RoadRunner

+1

@NaorMalca на самом деле согласен с ответом, который работает на вас – artm

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