Comment vérifier si les structures sont initialisées ou non
typedef struct dict_pair {
void *key;
void *value;
struct dict_pair *head;
struct dict_pair *tail;
} dict;
dict* NewDictionary(void) {
dict *dictionary = malloc(sizeof(dict_pair));
dictionary->head = null;
dictionary->tail = null;
}
int main(void) {
dict *dictionary = NewDictionary();
}
J'avais initialement prévu de définir les structures comme nulle, mais le compilateur ne le permet pas. Comment puis-je vérifier si une structure est affecté ou pas?
Aussi, puis-je consulter de manière récursive déclarer la même structure à l'intérieur de la structure?
Utilisation
écrire une réponse, je veux vous donner des accessoires pour elle.
Attendez... le problème, c'est que "null" n'a pas été reconnu? alors oui, la réponse est d'utiliser la valeur "NULL" à la place. Ou 0, si la valeur est NULL arrive pas à être définis dans votre environnement de dev, ce qui est rare de nos jours, mais toujours possible.
Quel problème essayez-vous de résoudre? Il semble que votre NewDictionary() fonction déjà les valeurs Null de votre tête et de la queue des pointeurs. N'est-ce pas de la vérification de ces assez?
juste une suggestion. Ne pas accepter la première réponse que vous regardez, de donner aux gens le temps d'écrire un coomprehensive réponse. Juste d'être récompensé pour avoir été le plus rapide à répondre ne va pas améliorer la qualité globale de réponses.
NULL
au lieu de null
. null
ne fait pas partie de la C.écrire une réponse, je veux vous donner des accessoires pour elle.
Attendez... le problème, c'est que "null" n'a pas été reconnu? alors oui, la réponse est d'utiliser la valeur "NULL" à la place. Ou 0, si la valeur est NULL arrive pas à être définis dans votre environnement de dev, ce qui est rare de nos jours, mais toujours possible.
Quel problème essayez-vous de résoudre? Il semble que votre NewDictionary() fonction déjà les valeurs Null de votre tête et de la queue des pointeurs. N'est-ce pas de la vérification de ces assez?
juste une suggestion. Ne pas accepter la première réponse que vous regardez, de donner aux gens le temps d'écrire un coomprehensive réponse. Juste d'être récompensé pour avoir été le plus rapide à répondre ne va pas améliorer la qualité globale de réponses.
OriginalL'auteur nubela | 2009-11-18
Vous devez vous connecter pour publier un commentaire.
C n'a pas
null
, il aNULL
. Donc, essayez ceci:Cette version corrige quelques problèmes:
value
etkey
non initialisée, donc ils pouvaient tenir aléatoire d'ordures. À l'aide decalloc()
va tout initialiser à 0, ce qui dans le pointeur de contexte estNULL
. Il ne sera pas même prendre beaucoup plus de temps de traitement.return
déclaration, c'est que par pure chance que quoi que ce soit sera retourné.dict_pair
au lieu destruct dict_pair
. En C++,struct
les noms sont dans le type ordinaire de l'espace de noms, c'est à diret x = { 0 };
est valide en C++, mais en C, vous auriez besoin de direstruct t x = { 0 };
.malloc()
(maintenantcalloc()
mais les mêmes règles s'appliquent). Si il n'y a pas assez de mémoire,calloc()
retourneNULL
. Je déteste déréférencer unNULL
pointeur sur l'accident. Nous n'avons pas à vérifier la valeur de retour ici parce que j'ai fait avec toutes les étapes intermédiaires -calloc()
est assez pour nous.Noter que
calloc()
est un peu moins portable. Même si la norme exige quevoid *p = 0
définit le pointeur vers un pointeur null, il ne nécessite pas que le pointeur null "tous les bits à zéro", ce qui estcalloc()
techniquement n'. Si vous ne souhaitez pas utilisercalloc()
pour cette raison, voici une version qui fait la même chose avecmalloc()
:Ou:
Voir comment beaucoup plus agréable l'
calloc()
version est?Quant à votre deuxième question:
Non, vous ne pouvez pas faire ceci:
Mais vous peut ce faire (qui est ce que vous faites, et ce que vous voulez):
Vous pouvez avoir un pointeur à un
struct
à l'intérieur de lastruct
lui-même, mais vous ne pouvez pas avoir la réellestruct
à l'intérieur de lastruct
lui-même. Ce que vous faites est parfaitement légal, parce que vous êtes à l'aide de pointeurs.calloc
version peut-être plus agréable, mais techniquement c'est pas portable. Il définit la représentation sous-jacente des pointeurs vers tous les bits à zéro, mais c'est pas nécessairement la même chose queNULL
(même si la valeur0
lors de la conversion d'un pointeur compare égal au pointeur null). (Non pas que je suis au courant de tout lieu où tous les bits à zéro les pointeurs ne sont pas égaux àNULL
, mais quelque chose à garder à l'esprit).J'ai été tout simplement pris conscience de ce point. J'ai vérifié et, si je pensais que le libellé était juste "calloc ensembles de choses à zéro", il ne précise pas "tous les bits à zéro", ce qui signifie que, oui, je ne crois que ce super-pointe-cas est valide.
Oui, c'est formulée de cette façon parce qu'il n'est pas raisonnable pour la mise en œuvre de savoir comment vous allez traiter le retour de la mémoire. La même chose s'applique à l'aide d'
calloc
pour attribuer des valeurs à virgule flottante - tous les bits à zéro n'est pas nécessairement0.0f
OriginalL'auteur Chris Lutz
Vous pourriez envisager de calloc plutôt que de malloc.
calloc remplit la mémoire qu'elle alloue avec des 0, de sorte que vous aurez votre tête et la queue NULLE w/o explicite d'affectation.
+1 pour John Wayne ici.
C'est faux; ce que ne font pas.
Comment est-il mauvais?
calloc() de la mémoire de tous les bits à zéro, de sorte que si vous avez regardé la RAM, avec une loupe, vous verrez "00000000...". C'est très bien pour les entiers, mais ne signifie pas que vous aurez à virgule flottante zéros ou des pointeurs null.
OriginalL'auteur Arkadiy
J'avais utiliser un allouée statiquement variable pour l'initialisation:
Cela garantit que les membres soient correctement mis à zéro, indépendamment du fait qu'ils sont des pointeurs, à virgule flottante ou les types d'entiers.
OriginalL'auteur Christoph
Vous pouvez les définir comme
NULL
, mais pas commenull
. C est sensible à la casse, et laNULL
constante est tout en majuscule.Et pour répondre à votre deuxième question, oui,
struct
définitions peuvent être récursifs dans un sens. La référence interne doit être un pointeur vers lestruct
, au lieu d'une droite définition de lastruct
. Si ce dernier a été autorisé, vous vous retrouvez avec une infinie recursingstruct
définition, ce qui serait une mauvaise chose. Voir Chris Lutz réponse pour plus de détails.OriginalL'auteur Ed Carrel
Je suis en utilisant une astuce qui fonctionne pour moi.
Maintenant u peut facilement vérifier si
t
est initialisé ou non. Et il n'y a pas de fuite de mémoire.OriginalL'auteur RatDon