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
[SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko [FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|