Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

question sur les pointers et strlen()

42 réponses
Avatar
Laurent Hamery
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 ?

10 réponses

1 2 3 4 5
Avatar
Florent 'flure' C.
Le Mon, 03 May 2004 11:59:20 +0200, Laurent Hamery a écrit :

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 0;


ok

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 :)

buffer2 = new char[blockSize];


ok

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 !


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 !

Avatar
Laurent Hamery
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 :)
Avatar
Jean-Marc Bourguet
"Laurent Hamery" 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.

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

Avatar
Florent 'flure' C.
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 :)
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 !

Avatar
kanze
"Florent 'flure' C." wrote in message
news:...

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
:)


Ç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:
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


Avatar
Loïc Joly
Florent 'flure' C. wrote:



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 :)
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


Avatar
Jean-Noël Mégoz
a écrit dans le message de
news:
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 !...



Avatar
Jean-Noël Mégoz
"Jean-Marc Bourguet" a écrit dans le message de
news:
"Laurent Hamery" 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.


Avatar
Horst Kraemer
On Tue, 4 May 2004 23:02:25 +0200, "Jean-Noël Mégoz"
wrote:


a écrit dans le message de
news:
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




Avatar
Michel Michaud
Dans news:4098034d$0$13078$, Jean-Noël
a écrit dans le message de
news:
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.

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
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/



1 2 3 4 5