Journal Tant qu'à faire de la programmation ..

Posté par  (site web personnel, Mastodon) .
Étiquettes : aucune
0
2
mai
2003
J'ai un problème très simple qui parait tout con, mais je vous mets au défi de le résoudre simplement :

Je possède un tableau de char (tableau) et je dois donner à une méthode (methode) comme paramètre un char* qui a comme valeur tableau[i]. La seule solution que j'ai trouvée est :

char* temp1=(char*)malloc(1);
char* temp2 = (char*)malloc(1);
*temp2 = currentSig[i];
strcat(temp1,temp2);
free(temp2);
methode(temp1);

Mais ce n'est bien sur par ce qu'il y'a de plus efficace ! Alors comment faire nom d'une pipe ? (ça parait tout con, mais je vous lance le défi ;-) )
  • # Re: Tant qu'à faire de la programmation ..

    Posté par  . Évalué à 0.

    char old = tableau[i+1];
    tableau[i+1] = 0;
    methode(tableau + i);
    tableau[i+1] = old;

    Cela suppose que la méthode prend bien un char * et non un char *&.
  • # Re: Tant qu'à faire de la programmation ..

    Posté par  (site web personnel) . Évalué à 2.

    Oula ! déja il y a un dépassement de buffer (temp1 ne peut contenir qu'un caractère mais strcat en met deux : currentSig[i] et le \0 terminal). Une façon beaucoup plus simple de faire ça est :

    char donnees[2] = {currentSig[i], '\0'};
    methode(donnees);
  • # Re: Tant qu'à faire de la programmation ..

    Posté par  (site web personnel) . Évalué à 3.

    Si modifier la donnée originale ne te derange pas:

    methode(&currentSig[i]);

    sinon:

    char plop = currentSig[i];
    methode(&plop);

    pour ne pas modifier la valeur originale.
  • # Re: Tant qu'à faire de la programmation ..

    Posté par  . Évalué à 8.

    char *temp1=(char*)malloc(1);
    char *temp2=(char*)malloc(1);
    Ca te prend comme place :
    2 fois : 4 bytes(ou 8 sur 64bits) pour le pointeur + au moins 8 pour l'allocation selon la heap que tu as, car la heap a pas une granularite de 1 byte mais plutot 8 minimum

    Et ca fait passer par malloc --> appel hyper-long

    Quand tu fais ton strcat(temp1,temp2); tu fais 2 erreurs :
    1) temp1 n'est pas forcement a 0 apres le malloc, si tu fais un strcat, il va essayer d'aller apres le 1er byte, hors du buffer et crasher
    2) Si temp2 n'est pas 0, strcat va parcourir le buffer temp2 jusqu'a ce qu'il trouve un 0 --> buffer overflow -> crash

    Moi je te proposes plutot :

    void mamethode(char *elt);

    char montableau[TAILLE_DE_TABLEAU];

    mamethode( &(montableau[i]) );

    Et la t'as effectivement passe un pointeur sur l'element i de ton tableau.
  • # Re: Tant qu'à faire de la programmation ..

    Posté par  . Évalué à 0.

    methode($tmp1.$tmp2);

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.