Why "segmentation fault" when merging two arrays?

1

I'm building a simple c / c ++ program that merges two arrays but I'm encountering an inconvenient error. I believe that when calling the function IntercalarArranjos , the program presents an error of type "segmentation fault".

I do not know if I'm wrong with the logic of this function and I know that this problem is related to improper memory access or simply overflow . Forgive me, but I'm still a beginner on this subject.

Here is the code:

 #include <iostream>
 #include <stdlib.h>
 #include <stdio.h>

 /****
 *
 *   Título do módulo :
 *
 *   Descrição geral  :
 *
 *   Entrada :
 *
 *   Saída   :
 *
 ****/
 void IntercalarArranjos ( float * primeiroArranjo , float *  segundoArranjo , float * arranjoIntercalado ,int quantPrimeiroArranjo ,  int quantSegundoArranjo , int quantArranjoIntercalado ){

     int i , j , k ;

     k = 0;

     j = 0;

     i = 0;

     while ( i < quantArranjoIntercalado ){

         if( j > quantPrimeiroArranjo ){

             *( arranjoIntercalado + i ) = *( segundoArranjo + j );

             k = k + 1;


         }

         if( k > quantSegundoArranjo ){

             *( arranjoIntercalado + i ) = *( primeiroArranjo + k );

             j = j + 1 ;

         }

         if(  j <=  quantPrimeiroArranjo && k <= quantSegundoArranjo ){

             if( i % 2 == 0 ){

                 *( arranjoIntercalado + i ) = *( primeiroArranjo + j );

                 j = j + 1 ;

             }
             else {

                 *( arranjoIntercalado + i ) = *( segundoArranjo + k );

                 k = k + 1 ;

             }
         }

     }
 }

 int cont = 0 ; /** variável global **/

 /****
 *
 *   Título do módulo : ImprimaVetor
 *
 *   Descrição geral  : Imprime o arranjo desejado
 *
 *   Entrada : (int) quantidade de elementos , (float) vetor dos elementos
 *
 *   Saída   : nenhuma
 *
 ****/

 void ImprimaVetor( int quantVetor , float * realVector ){

     int i ;

     cont += 1 ;

     if( cont == 1 ){

          printf("\nPrimeiro arranjo : ");

     }

     else{

         if( cont == 2 ){

             printf("Segundo arranjo : ");

         }

         else printf("Arranjos intercalados : ");

     }


     for( i = 0 ; i < quantVetor ; i ++ ){
         printf(" %f ", *( realVector + i ) );

     }

     printf("\n\n");

 }


 /****
 *
 *   Título do módulo : LeiaVetor
 *
 *   Descrição geral  : Lê o vetor de elementos
 *
 *   Entrada : (int) quntidade de elementos do vetor , (float) vetor dos    elementos
 *
 *   Saída   : nenhuma
 *
 ****/

 void LeiaVetor( int quantVetor , float * realVetor ){

     int i ;

     for( i = 0 ; i < quantVetor ; i ++ ){

         printf("\n\nDigite o %d elemento do arranjo :", i + 1 );
         scanf("%f", realVetor + i );

     }

 }

 int main()
 {

     float * primeiroArranjo , * segundoArranjo , * arranjoIntercalado ;
     int quantPrimeiroArranjo , quantSegundoArranjo , quantArranjoIntercalado ;

     printf( "---------------------------------------------------------");
     printf( "\nInsira a quntidade de elementos do primeiro arranjo :" );
     scanf("%d", &quantPrimeiroArranjo );

     primeiroArranjo = (float*) malloc( quantPrimeiroArranjo*sizeof(float) );

     LeiaVetor( quantPrimeiroArranjo , primeiroArranjo );

     printf("\n\n");

     printf( "---------------------------------------------------------");
     printf( "\nInsira a quntidade de elementos do segundo arranjo :" );
     scanf("%d", &quantSegundoArranjo );

     segundoArranjo = (float*) malloc( quantSegundoArranjo*sizeof(float) );

     LeiaVetor( quantSegundoArranjo , segundoArranjo );

     printf("\n\n");


     printf( "---------------------------------------------------------");

     quantArranjoIntercalado = quantSegundoArranjo + quantPrimeiroArranjo ;

     arranjoIntercalado = (float*) malloc(  quantArranjoIntercalado*sizeof(float) );

     IntercalarArranjos ( primeiroArranjo ,segundoArranjo ,arranjoIntercalado ,quantPrimeiroArranjo , quantSegundoArranjo ,quantArranjoIntercalado );

     ImprimaVetor( quantPrimeiroArranjo , primeiroArranjo  );

     ImprimaVetor( quantSegundoArranjo , segundoArranjo  );

     ImprimaVetor( quantArranjoIntercalado , arranjoIntercalado );

     printf("\n\n");

     return 0 ;

 }
    
asked by anonymous 07.01.2016 / 16:37

2 answers

3

The instructions

     k += k + 1;
     j += j + 1;

should be

     k = k + 1;
     j = j + 1;

or

     k += 1;
     j += 1;

or

     k++;
     j++;
    
07.01.2016 / 17:19
2

Dear colleague, analyzing your code I noticed that by changing the < relational operator as it appears in your code, for > () It does not display segmentation fault , more precisely in that part quoted below:

while ( i > quantArranjoIntercalado )

What I was able to notice is that you "instructed" that while i is less than quantArranjo Interterado do this, but there was no verification, since the only statement I changed was this besides declaring the functions before you define it.

Note: Another thing I noticed in your code is you are allocating, but you did not bother to release what was allocated.

    
15.01.2016 / 23:58