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

new T[0]

12 réponses
Avatar
Luc Hermitte
Bonjour,

Je me pose une question. Peut-on =E9crire:
char *p =3D new char[0];
?

Je ne sais pas si c'est autoris=E9, et si oui si c'est bien support=E9 par
tous les compilos.

Quelqu'un aurait des infos l=E0 dessus ? (question mot-cl=E9, "[0]" n'est
pas terrible pour faire des recherches sur le net :-()

--
Luc Hermitte

2 réponses

1 2
Avatar
espie
In article ,
Olivier Miakinen <om+ wrote:

- soit malloc(0) echoue.
- soit malloc(0) reussit,[...]

Par contre, free(0) est parfaitement standard,


Pour reprendre l'éternelle discussion, voici un cas précis où il vaut
mieux écrire NULL, histoire de ne pas faire le rapprochement entre
malloc(0) [0 est un entier] et free(0) [0 est un pointeur]...


Tiens, c'est vrai. D'ailleurs, n'a-t-il pas existé des implémentations
du langage C dans lesquelles NULL valait 0xFFFFFFFF ? Est-ce que ceci
est normalisé en C++ ?


Ceci est normalise en C comme en C++. La semantique du 0 est la meme:
il designe un pointeur nul dans un contexte ou on a besoin d'un pointeur.
Maintenant, un pointeur nul n'est pas forcement represente par une suite
d'octets ou tous les bits sont a zero.

Pour ce qui est de NULL, c'est legerement different... La definition du
C++ est un peu plus contraignante, et ca en fait un pointeur nul
`interessant' (confere gcc, qui a un built-in __null precisement pour lui
donner exactement la bonne semantique).

En C, ca se discute. C'est plus affaire de style qu'autre chose. Comme NULL
n'est pas garanti etre obligatoirement un pointeur nul en C, je prefere
personnellement un 0 tout seul, ca a l'avantage d'etre explicite (et
comme ca, on n'oublie pas le cast sur les fonctions varargs comme exec*(...))
(je trouve NULL sournois dans ses promesses non tenues).

En C++, la definition de NULL fait que c'est marginalement plus utile...



Avatar
James Kanze
On Jul 18, 1:40 am, (Marc Espie) wrote:
In article ,
Olivier Miakinen <om+ wrote:


- soit malloc(0) echoue.
- soit malloc(0) reussit,[...]

Par contre, free(0) est parfaitement standard,


Pour reprendre l'éternelle discussion, voici un cas précis où il vaut
mieux écrire NULL, histoire de ne pas faire le rapprochement entre
malloc(0) [0 est un entier] et free(0) [0 est un pointeur]...


Tiens, c'est vrai. D'ailleurs, n'a-t-il pas existé des implémentatio ns
du langage C dans lesquelles NULL valait 0xFFFFFFFF ? Est-ce que ceci
est normalisé en C++ ?



Il a existé (et peut-être il en existe encore) des machines ou
un pointeur nul n'a pas tous ces bits à zéro. Mais il n'y a pas
de façon en C ou en C++ pour épeler un pointeur nul ; le
« null pointer constant » n'est pas un pointeur, nul ou
autrement. (Il y a une tolérance en C qui le permet d'être un
pointeur, mais c'est toujours un pointeur qui résulte de la
conversion d'un entier.) Le macro NULL doit s'évaluer non à un
pointeur nul, mais à un « null pointer constant » ; en C++,
un « null pointeur constant » est obligatoirement une
expression entière (non un pointeur !) constante dont la valeur
est 0.

Ceci est normalise en C comme en C++. La semantique du 0 est
la meme: il designe un pointeur nul dans un contexte ou on a
besoin d'un pointeur.


Il se convertit en pointeur nul. La sémantique du token 0 ne
change pas -- c'est une constante octale avec type int, et
valeur zéro.

Maintenant, un pointeur nul n'est pas
forcement represente par une suite d'octets ou tous les bits
sont a zero.

Pour ce qui est de NULL, c'est legerement different... La definition du
C++ est un peu plus contraignante, et ca en fait un pointeur nul
`interessant' (confere gcc, qui a un built-in __null precisement pour lui
donner exactement la bonne semantique).


Tous les NULL en C++ sont aussi légale en C. Dans les deux
langages, NULL doit être un « implementation defined null
pointer constant ». C-à-d en C++, une expression entière
constante dont la valeur est 0. (Le C permet également une telle
expression convertie explicitement en void*. Une innovation du
comité de normalisation C, qui n'était pas présente dans le C de
K&R.)

Un symbole tel que "__null" a un comportement indéfini. C-à-d
que le compilateur est libre de le définir comme il veut, s'il
veut. G++ (et gcc ?) le reconnaît comme une expression entière
dont la valeur est 0, donc comme un « null pointer constant ».
Mais il en profite pour avertir si cette expression particulière
n'est pas immédiatement converti en pointeur nul.

En C, ca se discute. C'est plus affaire de style qu'autre
chose. Comme NULL n'est pas garanti etre obligatoirement un
pointeur nul en C,


D'où est-ce que tu as ça ? La norme C et la norme C++ disent
exactement la même chose pour NULL : « [it] expands to an
implementation-defined null pointer constant ».

je prefere
personnellement un 0 tout seul, ca a l'avantage d'etre explicite (et
comme ca, on n'oublie pas le cast sur les fonctions varargs comme exec*(. ..))
(je trouve NULL sournois dans ses promesses non tenues).


C'est le problème de NULL. Le problème de 0, c'est qu'il donne
moins d'information au lecteur. Le vrai problème, évidemment,
c'est la manque d'une vraie façon de spécifier un pointeur nul.
(Lacun que le C++ va combler dans la prochaine version, je
crois.)

En C++, la definition de NULL fait que c'est marginalement
plus utile...


Je ne comprends pas, vue que la définition est la même dans les
deux languages. En C++, je dirais, la risque en ne pas étant
explicit est marginalement plus grand : il n'y a pas seulement
les varargs ; il y a aussi la façon que ça joue dans la
résolution des surcharges et les instantiations de templates.

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




1 2