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
drkm
Horst Kraemer writes:

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


[...]

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

Avatar
Jean-Marc Bourguet
"Michel Michaud" 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.

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

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
Jean-Marc Bourguet
Horst Kraemer writes:

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

Avatar
Michel Michaud
Dans news:, Jean-Marc
"Michel Michaud" 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
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/


Avatar
Jean-Marc Bourguet
"Michel Michaud" writes:

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


Comme je l'ai deja ecrit, 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 :-(

Ni 0 ni NULL ne me pose un gros probleme. Je lis le code avec la meme
facilite (les problemes potentiels me semble de meme ordre avec les
deux). Je prefererais un mot cle comme null en Ada (qui est surcharge
lui-meme mais pas dans les memes contextes) ou nil en Pascal mais le
choix entre 0 et NULL en C et en C++ me laisse relativement
indifferent.

NULL n'a meme pas l'avantage de pouvoir etre defini a ce mot cle s'il
est introduit un jour avec une signification assez stricte: son
utilisation dans des contextes ou il faut un entier et non un pointeur
est trop courante (en particulier je l'ai vu employe systematiquement
la ou je mettrais '').

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
kanze
drkm wrote in message
news:...
Horst Kraemer writes:

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


[...]

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.


Dans les deux langages, la norme exige que NULL soit un macro qui
resolve en un « null pointer constant ». En C++, ça veut dire une
expression constante de type entier (int, long, etc.) dont la valeur est
0. C permet aussi une telle expression convertie explicitement en void*.

Donc, des expressions comme 0, 0L, voire (1 - 1) ou __nullptr (ou
__nullptr est un symbole interne du compilateur, que le compilateur sait
donner les qualités réquises) valent dans les deux langages -- en C++,
j'ai réelement vu tout sauf (1 - 1).

Et même si C permet ((void*)0), je n'ai jamais vu un compilateur C qui
l'utilisait. Dans la pratique, aujourd'hui, on ne voit que 0 et
__nullptr, quelque soit le langage. (L'avantage de __nullptr,
évidemment, c'est que si tu utilises NULL comme un entier, le
compilateur émet un avertissement. C'est donc la solution à préférer, du
point de vue de la qualité de l'implémentation.)

--
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
kanze
Horst Kraemer wrote in message
news:...

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


Ça varie. À vue d'oeil (un « guestimate », comme on dit en anglais), je
dirais qu'en C++, il y a à peu près 60% NULL, et 40% 0, tandis qu'en C,
la différence est plus près des 95%/5%. Mais je ne sais pas réelement
des pourcentages -- dans les boîtes où j'ai travaillé, on s'est toujours
servi de NULL, que ce soit du C ou du C++.

Historiquement, si on se place aux environs de 1990 ou avant, beaucoup
de compilateurs C++ se basaient directement sur le compilateur C, et se
servait aussi de ces en-têtes, sans les modifier. Et apparamment, il y a
eu quelques rares compilateurs C qui avaient défini NULL comme
((void*)0), ce qui ne marchait pas dans le compilateur C++. Du coup, des
programmeurs qui ont commencé le C++ bien avant 1990 avaient pris
l'habitude d'éviter NULL -- quand j'apprenais le C++, on disait souvent
d'éviter NULL, parce qu'il ne marchait pas partout, or que ce n'était
déjà plus le cas.

--
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
kanze
"Michel Michaud" wrote in message
news:<IEVlc.38550$...
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...


Cacher la vérité, ça ne serait pas plutôt donner le même nom à deux
fonctions qui font des choses différentes ?

Note bien aussi que dans le cas ci-dessus, un bon compilateur va bien
émettre un avertissement, pour dire bien que tu es en train d'utiliser
NULL comme un entier, et non comme un pointeur :

#include <stddef.h>

extern void f( int n ) ;
extern void f( char const* p ) ;

void
g()
{
f( NULL ) ;
}

du compilateur :

nulloverload.cc: In function `void g()':
nulloverload.cc:10: warning: passing NULL used for non-pointer argument 1 of `
void f(int)'

--
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
Horst Kraemer
On 05 May 2004 08:24:01 +0200, Jean-Marc Bourguet
wrote:

Horst Kraemer writes:

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?


Quelles statistiques ? Ce que j'ai dit ne dit absolument rien au sujet
de la relation entre les nombre des programmeurs qui préferent 0 et le
nombre de ceux qui préfèrent NULL ;-)

--
Horst


Avatar
drkm
writes:

"Michel Michaud" wrote in message
news:<IEVlc.38550$...


[...]

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...


Cacher la vérité, ça ne serait pas plutôt donner le même nom à deux
fonctions qui font des choses différentes ?


Comme dans

namespace std
{
template< class Type , class Trait = char_traits< Elem > >
class basic_ostream
 : virtual public basic_ios< Type , Trait >
{
basic_ostream & operator<<( int value ) ;
basic_ostream & operator<<( void const * value ) ;
} ;
}

 ?-)

[...]

--drkm


1 2 3 4 5