2010-02-20 3 views
1

Si je déclare un pointeur sur une struct dans .h par exemple:Un pointeur en .h est-il automatiquement défini sur NULL?

my_struct_t *ptr; 

... puis je vérifie if(ptr==NULL) dans le code, sans mettre réellement à ptr NULL ou l'allocation de mémoire pour elle, puis-je faire cette vérification pour voir si son égale à NULL? Essentiellement, ce que je demande, c'est d'avoir ptr dans le .h, est-ce qu'il est automatiquement réglé sur NULL, ou dois-je le faire?

Merci, Hristo

revisiont: cela se fait dans C

Répondre

4

De K & R2nd:

Dans le absense d'initialisations explicites, des variables externes et statiques sont garantis initialisés à zéro.

Alors, oui. Cela semble être dans la section A8.7 de la norme de 1990. Je ne sais pas où chercher dans la norme de 1999.

+0

Donc, je peux vérifier si (ptr == 0) juste en l'ayant déclaré dans le fichier d'en-tête? – Hristo

+0

Merci pour l'explication. J'ai fait une vérification pour if (ptr == 0) et si (ptr == NULL) et ils ont tous deux réussi. Alors, lequel de ces contrôles est le plus «correct» à utiliser? – Hristo

+0

NULL est # défini pour être 0, donc ils font la même chose. C'est un choix de style à choisir. – Alan

1

Il n'est pas une déclaration appropriée, vous auriez à le déclarer comme ceci:

extern my_struct_t *ptr; 

Et quelque part dans un fichier de code source .c définir réellement:

my_struct_t *ptr; 

qui rend zéro initialisé.

+0

le problème est, le fichier .c que j'ai besoin d'éditer est juste un fichier de fonctions qui seront utilisées à partir d'un autre c. fichier que je n'ai pas écrit et ne peux pas modifier. – Hristo

+0

Si cet en-tête est seulement inclus dans une unité de compilation, vous pouvez vous en sortir avec la forme suggérée par l'OP, mais c'est la bonne façon de le faire. – dmckee

+0

@hristo - n'importe quel fichier .c, peu importe celui que vous choisissez. –

0

Les variables globales sont automatiquement initialisées à zéro. Voir les cas dans my answer to another question. Remarquez que la définition de variables dans un fichier d'en-tête est une très mauvaise pratique - si plusieurs fichiers source incluent cet en-tête, vous aurez des symboles en double et ne pourrez pas lier le programme. Mieux déclarer cette variable comme extern dans l'en-tête et le définir uniquement dans un fichier source.

+0

Um, regardez: http://www.fnal.gov/docs/working-groups/fpcltf/Pkg/ISOcxx/doc/POD.html. – bmargulies

+0

@bmargulies: pointer vers docs C++ pour une question c est risqué. Les langues divergent dans les détails ici et là. Comparez à l'extrait de K & R que j'ai posté. – dmckee

+0

@dmckee Il semblait dire que C++ héritait celui-ci de C, mais le standard C est sûrement plus fiable. Je l'ai mis dans un commentaire au lieu d'une réponse pour une raison. – bmargulies

1

Pour répondre à votre question, oui, elle sera définie sur NULL. La variable aura une portée globale et les variables ayant une durée de vie globale seront initialisées à NULL (pour les pointeurs). Toutefois, vous ne devez pas placer une définition de variable dans un fichier .h. Si vous incluez ce fichier .h dans plus de 1 fichier .c, vous aurez plusieurs définitions de cette variable, ce qui n'est pas souhaitable.

Vous devez placer une déclaration dans le fichier d'en-tête, par ex.

extern my_struct_t *ptr; 

Et puis dans un de vos.fichiers c, placez une définition:

my_struct_t *ptr; 
0

extern struct foo* pfoo; dans un fichier d'en-tête et struct foo* pfoo; dans l'un des fichiers .c dehors de toute fonction vous obtiendrez stockage statique pour le pointeur et ainsi l'initialisation à zéro automatique.

extern qualificateur est la clé ici. Il indique au compilateur de ne pas allouer de stockage pour le pointeur dans chaque unité de traduction.

+0

si je devais le faire, je devrais mettre struct foo * pfoo; à l'intérieur d'une fonction qui sera appelée plusieurs fois. Cela signifie-t-il que mon pointeur continuera à être initialisé à zéro chaque fois que la fonction est appelée, ou seulement une fois? btw ... une fois que je sais que le ptr est NULL, je vais le réaffecter, donc ce ne sera plus NULL. – Hristo

+0

Deux points différents ici - 1.mettre "struct foo * pfoo;" dans une fonction en fait une ** variable locale **, donc pas d'initialisation à zéro (à moins que vous ne le préfixiez avec ** static **) 2. L'initialisation par zéro est une seule fois, c'est généralement fait par l'OS allouant le zéro rempli page (s) pour les données de programme statiques. Une fois que vous l'avez assigné - c'est votre responsabilité. –

0

Voici ce que K & R dit:

Les variables externes et statiques sont initialisés à zéro par défaut. Les variables automatiques pour lesquelles il n'y a pas d'initialiseur explicite ont des valeurs non définies (c'est-à-dire, garbage).

Les variables automatiques sont celles déclarées à l'intérieur d'une fonction. Puisque vous avez dit le fichier .h, le vôtre est probablement à l'extérieur et donc statique. Sinon, je crois que vous pourriez ajouter "= NULL" à la déclaration et vous n'avez donc pas besoin de vous souvenir de le faire ailleurs.

Je tente de ne créer aucune allocation ou code dans un fichier .h.

Questions connexes