C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

question sur les pointers et strlen()
Goto page 1, 2, 3  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Laurent Hamery
Guest





PostPosted: Mon May 03, 2004 9:59 am    Post subject: question sur les pointers et strlen() Reply with quote



bonjour
je debute en c++ et j`ai un soucis avec les allocations dynamiques de
tableaux
je suis sous window avec vc++
voici un resume de mon code :
int main() {

int blockSize =100;

char *buffer2 = 0;

buffer2 = new char[blockSize];

int sizeOfReturn = strlen(buffer2);

cout << "sizeOfReturn = " << sizeOfReturn << endl;

return 0;

}

/* RESULT */

sizeOfReturn = 105

certainement parce que je ne connais pas bien les pointers ... mais je ne
comprends pas pourquoi la je n`ai pas sizeOfReturn = 100 ...

pourriez vous m`expliquer tt ca ?




Back to top
Florent 'flure' C.
Guest





PostPosted: Mon May 03, 2004 10:10 am    Post subject: Re: question sur les pointers et strlen() Reply with quote



Le Mon, 03 May 2004 11:59:20 +0200, Laurent Hamery a écrit :

Quote:
bonjour
je debute en c++ et j`ai un soucis avec les allocations dynamiques de
tableaux
je suis sous window avec vc++
voici un resume de mon code :
int main() {

int blockSize =100;

ok

Quote:
char *buffer2 = 0;

Très bien, l'initialisation du pointeur, mais je le mettrai plutôt à
NULL. Les pointilleux diront que c'est la même chose, et d'autres
pointilleux diront que par contre ça améliore la clarté du code.
Par contre, il faut se méfier de ce genre d'initialisation suivant le
système sur lequel ça va tourner. Si le programme est stocké dans une
ROM par exemple, buffer2 pourrait être initialisé à 0 en ROM et donc se
retrouver inutilisable !! (j'ai déjà eu ce cas précis, je précise :)

Quote:
buffer2 = new char[blockSize];

ok

Quote:
int sizeOfReturn = strlen(buffer2);

Aïe aïe aïe !!!!
strlen retourne la longueur d'une chaîne à ZERO TERMINAL !
Or votre chaîne n'est pas initialisée, en effet le new se contente
de retourner un bloc mémoire, qui peut contenir des valeurs tout à fait
aléatoires !

Quote:

cout << "sizeOfReturn = " << sizeOfReturn << endl;

return 0;

}

/* RESULT */

sizeOfReturn = 105

Donc vous avez alloué une zone mémoire contenant des valeurs
aléatoires, mais pas de zéro. En revanche, 5 octets après la fin de
votre bloc s'en trouvait un qui valait zéro.


--
Florent "flure" C.
Décrypter l'@ pour répondre
Coders don't die, they just JMP without RET !


Back to top
Laurent Hamery
Guest





PostPosted: Mon May 03, 2004 10:27 am    Post subject: Re: question sur les pointers et strlen() Reply with quote



effectivement j`avais oublier cette histoire de ''
si je rajoute
buffer2[blockSize] = ''; alors a la fin j`ai bien 100

merci pour cette reponse si rapide :)



Back to top
Jean-Marc Bourguet
Guest





PostPosted: Mon May 03, 2004 11:05 am    Post subject: Re: question sur les pointers et strlen() Reply with quote

"Laurent Hamery" <lhamery (AT) yahoo (DOT) fr> writes:

Quote:
effectivement j`avais oublier cette histoire de ''
si je rajoute
buffer2[blockSize] = ''; alors a la fin j`ai bien 100

Surtout tu modifies en dehors de ce que tu as alloue.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Back to top
Florent 'flure' C.
Guest





PostPosted: Mon May 03, 2004 11:40 am    Post subject: Re: question sur les pointers et strlen() Reply with quote

Le Mon, 03 May 2004 12:27:45 +0200, Laurent Hamery a écrit :

Quote:
effectivement j`avais oublier cette histoire de ''
si je rajoute
buffer2[blockSize] = ''; alors a la fin j`ai bien 100

Tu as vraiment besoin d'un bon cours sur les pointeurs Smile
Ici, tu écris un octet après la fin de ton bloc, ce qui peut causer des
plantages voire pire ...
N'oublie pas qu'en C(++) on compte à partir de 0, donc si tu alloues N
éléments, le premier sera buffer2[0] et le dernier buffer2[N-1]
Donc tu aurais du mettre buffer2[blockSize-1] = '';
Et à la fin strlen te renverrais 99 et non 100, puisqu'une case est
occuppée par ton délimiteur de fin de chaîne (le zéro terminal)



--
Florent "flure" C.
Décrypter l'@ pour répondre
Coders don't die, they just JMP without RET !


Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Mon May 03, 2004 2:38 pm    Post subject: Re: question sur les pointers et strlen() Reply with quote

"Florent 'flure' C." <flurePASDESPAM (AT) freePASDESPAM (DOT) fr> wrote

Quote:
Le Mon, 03 May 2004 11:59:20 +0200, Laurent Hamery a écrit :

char *buffer2 = 0;

Très bien, l'initialisation du pointeur, mais je le mettrai plutôt à
NULL. Les pointilleux diront que c'est la même chose, et d'autres
pointilleux diront que par contre ça améliore la clarté du code.

Par contre, il faut se méfier de ce genre d'initialisation suivant le
système sur lequel ça va tourner. Si le programme est stocké dans une
ROM par exemple, buffer2 pourrait être initialisé à 0 en ROM et donc
se retrouver inutilisable !! (j'ai déjà eu ce cas précis, je précise
Smile

Ça, j'aimerais bien le voir. D'abord, évidemment, parce que son pointeur
n'est pas déclaré const -- il a donc tout à fait droit à le modifier
tant qu'il veut. Et aussi, parce que son pointeur, c'est une variable
locale, sur la pile -- j'aimerais bien savoir comment fonctionnerait un
programme dont la pile est en ROM.

Je me suis bien servi d'un compilateur qui réfusait l'initialisation
d'une variable globale non-const. Mais tout ce qu'il acceptait marchait
comme prévu ; c'était jusqu'il y avait une chose dans la norme qu'il ne
supportait pas.

--
James Kanze GABI Software mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Back to top
Loïc Joly
Guest





PostPosted: Mon May 03, 2004 6:38 pm    Post subject: Re: question sur les pointers et strlen() Reply with quote

Florent 'flure' C. wrote:

Quote:
Le Mon, 03 May 2004 12:27:45 +0200, Laurent Hamery a écrit :


effectivement j`avais oublier cette histoire de ''
si je rajoute
buffer2[blockSize] = ''; alors a la fin j`ai bien 100


Tu as vraiment besoin d'un bon cours sur les pointeurs Smile
Ici, tu écris un octet après la fin de ton bloc, ce qui peut causer des
plantages voire pire ...
N'oublie pas qu'en C(++) on compte à partir de 0, donc si tu alloues N
éléments, le premier sera buffer2[0] et le dernier buffer2[N-1]
Donc tu aurais du mettre buffer2[blockSize-1] = '';
Et à la fin strlen te renverrais 99 et non 100, puisqu'une case est
occuppée par ton délimiteur de fin de chaîne (le zéro terminal)



Et encore, c'est insuffisant... Si par hasard, le 42ème élément de son

bloc mémoire contenait 0, ça donnerait un résultat différent de 100.

--
Loïc

Back to top
Jean-Noël Mégoz
Guest





PostPosted: Tue May 04, 2004 9:02 pm    Post subject: Re: question sur les pointers et strlen() Reply with quote


<kanze (AT) gabi-soft (DOT) fr> a écrit dans le message de
news:d6652001.0405030638.5c6a4909 (AT) posting (DOT) google.com...
Quote:
char *buffer2 = 0;

Très bien, l'initialisation du pointeur, mais je le mettrai plutôt à
NULL. Les pointilleux diront que c'est la même chose, et d'autres
pointilleux diront que par contre ça améliore la clarté du code.


Je travaille moi aussi le C++ avec un cours où il est dit que
l'initialisation à 0 du pointeur est ce qui doit être fait en C++, plutôt
qu'avec NULL, comme on le fait en C !...



Back to top
Jean-Noël Mégoz
Guest





PostPosted: Tue May 04, 2004 9:10 pm    Post subject: Re: question sur les pointers et strlen() Reply with quote


"Jean-Marc Bourguet" <jm (AT) bourguet (DOT) org> a écrit dans le message de
news:pxbsmehn536.fsf (AT) news (DOT) bourguet.org...
Quote:
"Laurent Hamery" <lhamery (AT) yahoo (DOT) fr> writes:

effectivement j`avais oublier cette histoire de ''
si je rajoute
buffer2[blockSize] = ''; alors a la fin j`ai bien 100

Surtout tu modifies en dehors de ce que tu as alloue.

D'où la règle lorsqu'on crée un chaîne de 'taille' caractère :

myString = new char[taille + 1] ;
Le remplissage de la chaîne (avec un strcpy(myString , src) ou un myString =
"...") se charge alors du 0 en fin de chaîne.



Back to top
Horst Kraemer
Guest





PostPosted: Tue May 04, 2004 10:27 pm    Post subject: Re: question sur les pointers et strlen() Reply with quote

On Tue, 4 May 2004 23:02:25 +0200, "Jean-Noël Mégoz"
<nospam_jnmegoz (AT) infonie (DOT) fr> wrote:

Quote:

[email]kanze (AT) gabi-soft (DOT) fr[/email]> a écrit dans le message de
news:d6652001.0405030638.5c6a4909 (AT) posting (DOT) google.com...
char *buffer2 = 0;

Très bien, l'initialisation du pointeur, mais je le mettrai plutôt à
NULL. Les pointilleux diront que c'est la même chose, et d'autres
pointilleux diront que par contre ça améliore la clarté du code.


Je travaille moi aussi le C++ avec un cours où il est dit que
l'initialisation à 0 du pointeur est ce qui doit être fait en C++, plutôt
qu'avec NULL, comme on le fait en C !...

En C et en C++

p = 0;
et
p = NULL;

sont corrects les deux.

Peut-etre tu as mal compris le prof ou le prof c'est mal exprimé ou
c'est un mauvais prof et il faut changer le prof.

La vérité est que beaucoup de programmeurs C++ préfèrent 0 et beaucoup
de programmeurs C préfèrent NULL.


--
Horst

Back to top
Michel Michaud
Guest





PostPosted: Tue May 04, 2004 11:26 pm    Post subject: Re: question sur les pointers et strlen() Reply with quote

Dans news:4098034d$0$13078$636a15ce (AT) news (DOT) free.fr, Jean-Noël
Mégoz <nospam_jnmegoz (AT) infonie (DOT) fr> a écrit :
Quote:
kanze (AT) gabi-soft (DOT) fr> a écrit dans le message de
news:d6652001.0405030638.5c6a4909 (AT) posting (DOT) google.com...
Très bien, l'initialisation du pointeur, mais je le mettrai
plutôt à NULL. Les pointilleux diront que c'est la même
chose, et d'autres pointilleux diront que par contre ça
améliore la clarté du code.

D'autres pointilleux diront que ça cache la vérité et que ça
n'améliore rien.

Quote:
Je travaille moi aussi le C++ avec un cours où il est dit que
l'initialisation à 0 du pointeur est ce qui doit être fait en
C++, plutôt qu'avec NULL, comme on le fait en C !...

Ne pas oublier le cas qui montre que cacher la vérité n'est pas
toujours bonne.

void F(int n)
{
cout << "Ben voyons !";
}

void F(char *p)
{
cout << "Évidemment ?";
}

F(NULL);

Ce cas n'est pas vraiment possible en C, ce qui peut expliquer
que NULL n'y ait pas aussi mauvaise presse...

--
Michel Michaud [email]mm (AT) gdzid (DOT) com[/email]
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/


Back to top
drkm
Guest





PostPosted: Tue May 04, 2004 11:42 pm    Post subject: Re: question sur les pointers et strlen() Reply with quote

Horst Kraemer <horst.kraemer (AT) epost (DOT) de> writes:

Quote:
On Tue, 4 May 2004 23:02:25 +0200, "Jean-Noël Mégoz"
[email]nospam_jnmegoz (AT) infonie (DOT) fr[/email]> wrote:

[...]

Quote:
En C et en C++

p = 0;
et
p = NULL;

sont corrects les deux.

En C, NULL vaut 0, 0L ou (void*)0. En C++, il vaut 0.

[...]

--drkm

Back to top
Jean-Marc Bourguet
Guest





PostPosted: Wed May 05, 2004 6:23 am    Post subject: Re: question sur les pointers et strlen() Reply with quote

"Michel Michaud" <mm (AT) gdzid (DOT) com> writes:

Quote:
Ne pas oublier le cas qui montre que cacher la vérité n'est pas
toujours bonne.

void F(int n)
{
cout << "Ben voyons !";
}

void F(char *p)
{
cout << "Évidemment ?";
}

F(NULL);

Ce cas n'est pas vraiment possible en C, ce qui peut expliquer
que NULL n'y ait pas aussi mauvaise presse...

J'attends toujours un cas realiste ou il est sense d'avoir une
surcharge sur char* et int et ou passer une constante pointeur nul est
sense.

(En fait je comprends les arguments des deux cotes et je ne suis
convaincu par personne. Ce qui a l'effet malheureux que j'ai tendance
a etre incoherant sur ce point ce qui est la pire des
alternatives Sad).

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Back to top
Jean-Marc Bourguet
Guest





PostPosted: Wed May 05, 2004 6:24 am    Post subject: Re: question sur les pointers et strlen() Reply with quote

Horst Kraemer <horst.kraemer (AT) epost (DOT) de> writes:

Quote:
La vérité est que beaucoup de programmeurs C++ préfèrent 0 et beaucoup
de programmeurs C préfèrent NULL.

Quel est la source de tes statistiques?

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Back to top
Michel Michaud
Guest





PostPosted: Wed May 05, 2004 7:21 am    Post subject: Re: question sur les pointers et strlen() Reply with quote

Dans news:pxbsmefjstl.fsf (AT) news (DOT) bourguet.org, Jean-Marc
Bourguet <jm (AT) bourguet (DOT) org> a écrit :
Quote:
"Michel Michaud" <mm (AT) gdzid (DOT) com> writes:

Ne pas oublier le cas qui montre que cacher la vérité n'est pas
toujours bonne.

void F(int n)
{
cout << "Ben voyons !";
}

void F(char *p)
{
cout << "Évidemment ?";
}

F(NULL);

Ce cas n'est pas vraiment possible en C, ce qui peut expliquer
que NULL n'y ait pas aussi mauvaise presse...

J'attends toujours un cas realiste ou il est sense d'avoir une
surcharge sur char* et int et ou passer une constante pointeur
nul est sense.

Je crois qu'à part le code de très bas niveau (disons, par
exemple, pour implémenter une liste), on trouve rarement le
besoin de manipuler des pointeurs qui peuvent être nuls...
Mais j'imagine qu'on pourrait trouver un exemple réaliste où
la surcharge pose problème.

De toute façon, le problème n'est probablement pas bien posé :
c'est plutôt le fait que ceux qui préconise NULL le font parce
qu'ils veulent indiquer qu'il s'agit d'un pointeur, dans des
contextes où ça ne serait pas clair. Mon impression est que
dans ces cas, il faudrait plutôt améliorer le code pour le
rendre plus clair, car rien n'assure qu'utiliser NULL donnera
le résultat attendu autant au niveau de la lisibilité qu'au
point de vue de la sémantique puisque NULL peut être 0.

Ainsi je doute que

MaClasse* ptr= 0;

pose problème. Par contre

x= 0;

en pose un, si x est un pointeur, mais je crois que mettre NULL ne
résoudra le problème de la qualité du code qu'à cette ligne alors
que mettre un meilleur nom que x le résoudra partout. Je note
que le message qui a parti la discussion utilisait buffer2 pour
nommer un pointeur : pour moi, ce n'était pas un bon identificateur
et c'est par là qu'il faudrait commencer pour améliorer le code.

En fait, pour paraphraser quelqu'un, « j'attends toujours un cas
réaliste où il est sensé » ... de voir un problème avec 0 ! :-)

--
Michel Michaud [email]mm (AT) gdzid (DOT) com[/email]
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/


Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Goto page 1, 2, 3  Next
Page 1 of 3

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.