begin process at 2012 02 11 04:41:51
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Débutant(e)

 > 

eviter les debordement memoire en c


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

eviter les debordement memoire en c

mercredi 6 août 2008 à 11:49:33 | eviter les debordement memoire en c

flofloo

bonjour tout le monde j'ai un probleme avec la gestion des pointeurs voila je m'explique de suite...
j'ai une fonction "ExtractString" dont voici l'entete :
char *ExtractString(char *string,int pos,char sep);cette fonction extrait une sous chaine de l'argument "string".le remplisage du pointeur renvoyer par la fonction commence a partir de l'argument pos et continue tant que le caractere lu est different de l'argument sep!
mais voila la sous chaine renvoyee ne prend que 32 caracteres!alors comment empecher le debordement memoire durant le remplisage du pointeur!
gespere m'etre bien expliquer
merci..

mercredi 6 août 2008 à 12:28:10 | Re : eviter les debordement memoire en c

Neo_Fr

Membre Club
Une string est normalement toujours terminer par le caractere NULL(0), tu as donc juste a controle que le caractere pointé par ton pointeur est positif..
Poste ton code sinon ce sera mieux pour t'aider

Neo_Fr
mercredi 6 août 2008 à 15:18:42 | Re : eviter les debordement memoire en c

flofloo

le voici :

void extractstring(char *string,int pos,char sep)
{
     char *extract = malloc(32*sizeof(char));
    int i;i=0;
  char c = string[i];
while(c!=sep)
{
  extract[i] = sep;
}
}

mercredi 6 août 2008 à 15:21:46 | Re : eviter les debordement memoire en c

flofloo

mince g fait kelke erreur dsl :
dans le while :
extract[i] = c;//et non sep
i++;
c = string[i];

et si vous pouver m'aider dans l'ecriture avec les pointeur d'une facon plus efficace merci..et dsl encore

mercredi 6 août 2008 à 16:19:18 | Re : eviter les debordement memoire en c

Neo_Fr

Membre Club
Evite tant que possible de retourner de la memoire allouer avec malloc si tu veux pas etre obliger de faire des free() partout dans ton code.., le mieux reste d'écrire directement sur un pointeur passer en param de cette facon tu fait l'alloc/desalloc en dehors de ta fonction ce qui evite tout oublie de desalloc..

Ex:

void __stdcall ExtractString(LPSTR lpszIn, LPSTR lpszOut, DWORD dwStartFrom, char Separator)
{
    LPSTR lptr;
    lptr = lpszIn + dwStartFrom;
    while(*lptr != Separator) *lpszOut++ = *lptr++;
    *lpszOut = 0;
}

int main(void)
{
    char szTest[] = "blablablaCeci est un test;blabla";
    char szRet[16];
    ExtractString(szTest, szRet, 9, ';');
    printf("%s", szRet);

    system("PAUSE");
    return 0;
}

Neo_Fr
mercredi 6 août 2008 à 16:27:02 | Re : eviter les debordement memoire en c

SAKingdom

Membre Club
void ExtractString(LPSTR lpszIn, LPSTR lpszOut,, UINT uLen, UINT uStartFrom, char cSeparator)
{
    LPSTR lptr;

    // Ici on pourrait tester que les paramètres contiennent les valeurs nécessaires

    lptr = lpszIn + uStartFrom;
    while(*lptr && --uLen && *lptr != cSeparator) *lpszOut++ = *lptr++;
    *lpszOut = 0;
}


ExtractString(szTest, szRet, sizeof(szRet), 9, ';');

C++ (@++)

mercredi 6 août 2008 à 16:29:25 | Re : eviter les debordement memoire en c

zaibacker

Salut, je te propose ce code que je n'ai pas testé
2 inconvénients:
- dans notre cas nous n'avons alloué que 32 octets(soit 32 caractères au maximum).
- si l'arguments "sep" n'est pas trouvé, je ne veux même pas savoir ce qui va se passer car ile while n'a aucune autre clause d'arret.

void extractstring(char *string,int pos,char sep)
{
char *extract = malloc(32*sizeof(char));
int i;

i= 0;
j = pos;

while( extract[i] != sep )

extract[i] = string[j];

i++;
j++;

}

extract[i] = '\0';
}


PS: je crois que "char *extract = malloc(32*sizeof(char));" pourrait être remplacé par "char *extract = malloc(strlen(string)*sizeof(char)); "

mercredi 6 août 2008 à 16:33:09 | Re : eviter les debordement memoire en c

SAKingdom

Membre Club
"- dans notre cas nous n'avons alloué que 32 octets(soit 32 caractères au maximum)."

Là tout l'intérêt du code proposé par neo_fr

"- si l'arguments "sep" n'est pas trouvé, je ne veux même pas savoir ce qui va se passer car ile while n'a aucune autre clause d'arret."

Là tout l'intérêt du code modifié de neo_fr que j'ai proposé.

C++ (@++)

jeudi 7 août 2008 à 13:34:44 | Re : eviter les debordement memoire en c

Telepathmaster

Pour revenir à la question de l'allocation dynamique, même si pour ce type de fonction il est clair qu'un alloc interne n'est pas la meilleure solution, je donnerais ça pour la posterité et la pédagogie pour les cas où c'est nécessaire :

char * extractString(char * str, size_t pos, char sep) {

    int i;
    char * ext;

    if (pos > strlen(str))
       return NULL;

    /* Rappel au passage qu'un pointeur est passé par valeur */
    str += pos;

    for ( i = 0; i < strlen(str) && str[i] != sep;i++);

    /* Connaissant désormais la taille à allouer on ne risque plus l'overflow */
    ext = malloc(i+1);
    memcpy(ext,str,i);
    ext[i] = 0;

    return ext;

}

int main() {

    char str [] = "da;test;string", * tmp;
   
    if ((tmp = extractString(str,3,';')) != NULL)
        printf("%s\n",tmp);
   
    free(tmp);
   
    return 0;

}


Une autre solution, come cité plus haut serait de systématiquement allouer la taille de la chaine originale, mais dans ce cas l'utilité d'une allocation dynamique devient nulle.



--
François GOICHON
http://bases-hacking.org/?url=programmation
jeudi 7 août 2008 à 14:47:52 | Re : eviter les debordement memoire en c

SAKingdom

Membre Club
Appel strlen UNE SEULE FOIS avant le test if(pos > strlen(...)). D'ailleurs ici, ça devrait être if(pos >= len).
Puisque que la taille est déjà récupérée, on l'utilisera aussi dans la boucle mais sinon, suffit simplement de tester si le caractère courant (str[i]) est non nul.

"mais dans ce cas l'utilité d'une allocation dynamique devient nulle."

Peut-être mais pour la perte de cycle CPU que cela occasionne, peut-être est-il mieux de ne pas en tenir compte.

C++ (@++)


1 2

Cette discussion est classée dans : fonction, char, argument, memoire, debordement


Répondre à ce message

Sujets en rapport avec ce message

Chaine de Char et Memoire ! [ par Soft ] Bonjour,Qq1 connait il un moyen pour charger le contenu d'un fichier (pouvant atteindre plusieurs dizaines de MO) dans un char *buffer;Car meme avec u fonction surchargées [ par cabarrus ] à l'aide s.v.pécrire un prog qui surcharge une fonction getnumber(lire nombre).si vous passez un argument bool, cette version de la fonction retourne char -> char* [ par gangsoleil ] Salut,Je souhaite transformer un char en char*, et impossible de trouver une fonction qui fasse ca en C !A priori, aucune fonction de string.h ne peut PROBLEME pour retourner un char* a partir d'un fichier [ par kobee12 ] Voici ma fonction. Elle prend en argument un caractere. A partir de ce caractere, elle renvoie la chaine qui lui est associe.Par exemple:"fichier_lang PROBLEME pour retourner un char* apres recuperation d'une chaine(sscanf) d'un fichier [ par kobee12 ] Voici ma fonction. Elle prend en argument un caractere. A partir de ce caractere, elle renvoie la chaine qui lui est associe.Par exemple:"fichier_lang Convertir une string en char* [ par dickymoe ] Existe-t-il une fonction qui permet de convertir une string en char* ?ou alors une fonction qui compare deux string sans respecté la casse ???Merci(en renvoie d'un tableau en char ds une fonction [ par TheBabyCool ] Comment peut on renvoyer un tableau de char du type :char i[][] dans une fonction ?Merci FONCTION EN C, ET RENVOIE D'ARGUMENT [ par GazGaz ] lu allje voulais savoir un truc : une fonction en c, peut elle renvoyer 2 arguments ? ma fonction dans mon algo admet en argument une chaine de caract pb avec variable [ par jeffise57 ] Please aidez moiJe reçoit comme arugument du fonction des variables unsigned char* et je doit passer dans une deuxième fonction les même arguments mai Pour les doués, moi j'en peu plus ! [ par sena ] Salutje voudrais en fait faire un passage de paramètre a une fonction dont un a une valeur par défaut. (puis inclure ca dnas une DLL)Par exemple une f


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 4,134 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales