Erreur de segmentation

Bonsoir,
le programme suivant fait ce qui suit:

  1. Recherche d’un segment de disque par son numéro puis l’afficher
    2.recherche d’une chaîne dans le disque(trouver le numéro du disque)
    Mais l’ors de l’appel de la procédure de recherche de la chaîne j’ai cette erreur:“erreur de segmentation” j’ai essayé plusieurs déclarations de variables …mais j’ai toujours la même erreur
    voici le code:

    int tailleTabResultat;

        char *Lire_secteur(int Num_sect)
     {
    
     printf("\n dans la fonction lecture_secteur");
         char *tampon;//[tailleBuffeur];
         int i=0;
         tampon = malloc(sizeof(char)*512);
         FILE *disque=fopen("/dev/sda","r");
    
         if(disque!=NULL)
         {
             fseek(disque, Num_sect*512, SEEK_SET);
             for(i=0; i<512; i++)
             {
                 tampon[i]=getc(disque);
    
    
    
             }
             fclose(disque);
         }
    
    
         return tampon;
     	
     }
    

    void Afficher_Secteur(int Num_sect)
    {
    char *tampon;
    int i,j;
    j=0;
    tampon=Lire_secteur(Num_sect);
    system(“clear”);
    for(i=0; i<512; i++)
    {

         if(i%16==0)
         {
             if(j==0)printf("\n0000   ");
             else if(j<100)printf("\n00%d   ",j);
             else printf("\n0%d   ",j);
             j=j+16;
         }
         printf("%2.2hhx ",tampon[i]);
    
     }
     pri=ntf("\n");s
    

    }

    //--------------la recherche

    void ChaineVersOctet(char *chaine,char *chaineOctet,int *nbOctets)
    {
    char c[2];
    nbOctets=strlen(chaine)/2;
    int i=0,j=0,cpt=strlen(chaine)/2;
    majusculeChaine(chaine);
    printf("\n dans la fonction chaineversoctet majusculechaine est %s",chaine);
    while(i<cpt)
    {
    //

    c[0]=chaine[j];
    j++;
    c[1]=chaine[j];
    j++;
    chaineOctet[i]=HexaVersEntier©;
    printf("\n chaineoctetde i = %2.2hhx ",chaineOctet[i]);

         i++;
     }
    

    }

    char majusCaract(char c)
    {
    char a;
    if(c<103 && c>96) a=c-32;
    else a=c;
    return a;

    }

    void majusculeChaine(char *chaine)
    {
    int i=0;
    for(i=0; i<strlen(chaine); i++)
    {
    chaine[i]=majusCaract(chaine[i]);
    printf("%c", chaine[i]);
    }
    }

    int HexaVersEntier(char tab[2])

    {

     int entier=0;
     if(tab[1]>47 && tab[1]<58)entier = tab[1]-48;
     else entier = tab[1]-55;
     if(tab[0]>47 && tab[0]<58)entier+=(tab[0]-48)*16;
     else entier+=(tab[0]-55)*16;
    
     return entier;
    

    }

    int *Rechercher_secteur(char * chaine_info,int secteur_debut,int secteur_fin)
    {
    printf("\n\n dans la fonction de rechrche ");

     char chaineOctet[512];
     int longueurChaineOctet;
     char *tampon;
     int nbSecteurs=0,numSecteur=secteur_debut,*tabResultat=NULL,i=0,j=0,tmp=0,continuer=1,stop=0;
     ChaineVersOctet(chaine_info,chaineOctet,&longueurChaineOctet);
     printf("\nLa chaine apres vers octet est : %2.2hhx ",chaineOctet);
     tabResultat=malloc(sizeof(int)*(secteur_fin-secteur_debut+1));
    
     while(numSecteur<=secteur_fin)
     {
         tampon=Lire_secteur(numSecteur);
         i=0;
         j=0;
         continuer=1;
         while(i<512  && continuer==1)
         {
             j=0;
    
             if(tampon[i]==chaineOctet[j])
             {
                 printf("\n ha carac trouvé est: %d ",tampon[i]);
                 tmp=i;
                 tmp++;
                 j++;
                 stop=0;
                 while(tmp <512 && j<longueurChaineOctet && stop==0)
                 {
                     if(tampon[tmp]==chaineOctet[j])
                     {
                         printf("\n ha carac trouvé est: %2.2hhx  ",tampon[tmp]);
                         tmp ++;
     		j++;
                     }
                     else
                     {
     					
                         stop = 1;
                         j=0;
                         i++;
                     }
                 }
                 if(tmp <=512 && j==longueurChaineOctet)
                 {
                     continuer=0;
                     tabResultat[nbSecteurs]=numSecteur;
                     nbSecteurs++;
                 }
             }
             else i++;
         }
    
    
         numSecteur++;
    
     }
     tailleTabResultat=nbSecteurs;
     return tabResultat;
    

    }

    void AffichTabResRech(int *tabRes)
    {

     printf("\n\n\tResultat de recherche : \n");
     int i=0;
     for(i=0; i<tailleTabResultat; i++)
     {
    
         printf("\n Numero du secteur :");
    
         printf(" %d ",tabRes[i]);
    
     }
     if (tailleTabResultat==0)printf("\n\n\t La chaine recherchee non trouvee .\n\n");
    

    }
    int main( )
    {

     char *Tampon;
     int Num_sect,nbSect;
     int *tabResRech;
     char chaineRech[1024];
    

    printf("\l’affichage de secteur numero1");
    Afficher_Secteur(1);
    printf(“Recherche de la chaine: 24ad”);
    tabResRech=Rechercher_secteur(“24ad”,1,1)
    AffichTabResRech(tabResRech);
    return 0;
    }

Remarque: j’ai pas utilisé des scanf pour éviter la même erreur !
Merci d’avance
Cordialement

Bonjour
Dans la fonction majusculeChaine(char *chaine) la ligne : chaine[i]=majusCaract(chaine[i]); vous avez une perte d’adresse essayer de passer par des pointeurs au lieu de variable locale (copie)
à bientôt

salut
je ne programme plus en C, mais pourrait-il y avoir un programme avec des caractères prenant plus d’un octet lors d’une définition de type char?

et la fonction HexaVersEntier me paraît étonnante car entier = tab[1]-55; peut donner des valeurs négatives
à quoi sert-elle?
Vu son nom elle devrait faire return tab[0]*16+tab[1]