Accueil > Forum > > > > eviter les debordement memoire en c
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
|
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
|
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
|
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
|
"- 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
|
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++ (@++)
|
|
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
Livres en rapport
|
Derniers Blogs
TECHDAYS PARIS 2010 : SHAREPOINT 2010 POUR LES DéVELOPPEURSTECHDAYS PARIS 2010 : SHAREPOINT 2010 POUR LES DéVELOPPEURS par ROMELARD Fabrice
Animé par: Laurent Cotton Le développement dans SharePoint 2010 passe par plusieurs axes qui seront évoqués dans cette session, mais plus particulièrement les développements simples lié au besoin Business Business Connectivity Services Ce BCS es...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2010 : PLEINIèRE DERNIER JOURTECHDAYS PARIS 2010 : PLEINIèRE DERNIER JOUR par ROMELARD Fabrice
Cette session est la dernière pleinière de ces 3 jours de TechDays Paris 2010. Généralement, cette troisième journée est plus axée sur l'avenir vu par Microsoft. Après un retour sur l'avenir vu par la Science Fiction ou par ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice UNE JOLIE-HORLOGE ET PAS QU'UN PEU !UNE JOLIE-HORLOGE ET PAS QU'UN PEU ! par neodante
Pour les possesseurs d'iPhone, ça y est Bijin Tokei - qui se traduit littéralement en Français par " Jolie Horloge " - est arrivé et GRATUITEMENT s'il vous plaît ! Après la version Tokyo, Hokkaido, night club, racing, Gal, "pour les mademoiselles'", . voi...
Cliquez pour lire la suite de l'article par neodante TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion
Forum
RE : WIN APIRE : WIN API par racpp
Cliquez pour lire la suite par racpp
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|