0
votes

Obtenir une erreur: "Variable ... est ininitialisée lorsqu'il est utilisé dans sa propre initialisation" en C

J'essaie de faire une vérification de la fonction qui tourne pour la première fois avec minuscule, puis la compare aux mots de dictionnaire stockés dans une liste liée. J'ai vu ce Post avec titre similaire, Mais le problème semble différent.

Je reçois l'erreur suivante: P>

Dictionary.c: 171: 23: Erreur: la variable 'TEMP' est ininitialisée Lorsqu'il est utilisé dans sa propre initialisation p> BlockQuote>

Et je sais que c'est probable parce que j'utilise un pointeur pour une température de variable de charme, tout en utilisant la température de TEMP dans la propre initialisation de Temp. J'ai essayé un certain nombre de choses différentes telles que l'initialisation de Temp avec un autre nom, donc je n'utilise pas la même variable dans son initialisation. Je continue à obtenir des erreurs. Je suis assez nouveau à C et j'aimerais comprendre une certaine compréhension à ce sujet. P>

Ma fonction est ci-dessous: P>

// Returns true if word is in dictionary else false
//watch linked list vid
bool check(const char *word)
{
    // TODO
    printf("the word is %s", word);
    //need to use case
    node *cursor = head;
    while(cursor != NULL)
    {

      //this will point to previous places in linked list
      cursor = cursor -> next;

      //make it lowercase
    //   if (isalpha(word) )
    //   {
    //      word = tolower(word);
    //      printf ("\n Lowercase of Entered character is %c", Ch);
    //   }
    //   char *temp = strdup(string); // make a copy


char *temp  = strcpy (temp, word); // strlwr(word); //strdup(word); // make a copy

// adjust copy to lowercase //https://stackoverflow.com/questions/32063131/how-to-convert-constant-char-pointer-to-lower-case-in-c
unsigned char *tptr = (unsigned char *)temp;
while(*tptr) {
    *tptr = tolower(*tptr);
    tptr++;
}
//do things
// release copy
//free(temp);

        //iterate through the char[]
        int isEqual = 1;
        int i = 0;
        int j = 0;
        while(temp[i] != '\0' || cursor->word[j] != '\0')
        {
            if(temp[i] != cursor->word[j])
            {
            isEqual = 0;
            break;
            }
            i++;
            j++;
        }
        if(isEqual == 1)
        {
        printf("EVEN STEVEN! %s", temp);
        return true;
        }
    }
    return false;
}


4 commentaires

STRUP est la fonction correcte à utiliser. Je vois que c'est commenté deux fois. Pourquoi donc?


@ user3386109: il y a un léger problème avec STRDUP () : il n'est pas décrit par la norme C11 (il est décrit par POSIX qui est utilisé dans de nombreuses implémentations)


@PMG C'est vraiment un très très léger problème, car sur toute implémentation qui ne prend pas en charge STRUP , il est trivial pour fournir votre propre STRUP . Et sans doute mieux la conception à le faire, plutôt que de diffuser des copies de cette fonctionnalité dans le code.


Si vous n'avez pas STRUP , alors utilisez simplement taille_t len ​​= strylen (mot); Char * temp = malloc (len + 1); Si (Temp == NULL) {PERROR ("MALLOC-TEMP"); sortie (sortie_failure); }; memcpy (Temp, mot, len + 1);


3 Réponses :


0
votes

Le problème est que vous utilisez le pointeur TEMP dans sa propre initialisation / déclaration: xxx

TEMP dans Strcpy () n'est pas déclaré avant l'utilisation de cette expression et ne pointe pas sur un tableau char . Il pointe de nulle part ou de mieux dire à sa propre entité, qui n'est même pas déclarée à ce moment-là, ce qui n'est pas valide.

Au fait: il n'y a absolument aucune raison d'utiliser le même identifiant plusieurs Temps en même temps dans un code C, il est néanmoins assez invalide. En C ++, il est différent, tandis que vous pouvez utiliser des espaces de noms et leurs mots-clés respectifs pour utiliser les mêmes identifiants pour différentes variables et / ou avec différentes valeurs dans la même portée.

J'ai essayé un certain nombre de choses différentes telles que l'initialisation de Temp avec un autre nom, donc je n'utilise pas la même variable dans son initialisation. Je continue à obtenir des erreurs.

Pouvez-vous fournir le code modifié et les erreurs que vous obtiendrez avec elle?


0 commentaires

0
votes

La ligne en question est xxx pré>

Il s'agit d'une initialisation d'un pointeur, composée de deux parties: la nommage de l'objet p> xxx pré> et la valeur utilisée pour l'initialiser p> xxx pré>

dans la 2e partie TEMP code> (l'identifiant a été déclaré mais non initialisé à ce stade) est non valide pour le moment. Il est faux de le transmettre à strcpy () code> p>


Remarque: la voie directe de faire ce que vous voulez est: p>

char *temp = malloc(strlen(word) + 1); // allocate enough space
strcpy(temp, word); // no need to assign to temp
// use temp
free(temp);


0 commentaires

0
votes

ici xxx

vous définissez TEMP comme un pointeur sur char.
C'est la partie xxx

cette pièce xxx

initialise cette nouvelle variable nommée TEMP , C'est-à-dire que c'est l'initialisation.

L'initialisation appelle la fonction Strcpy , donnant deux paramètres, Temp et mot . < BR> Donc, votre code utilise TEMP pour initialiser TEMP .
C'est ce que le message d'erreur vous dit. Et à juste titre, parce que Strcpy retourne une copie du pointeur de destination sur le succès, mais uniquement sur le succès. Et il ne peut pas réussir avec un pointeur qui ne pointe pas encore la mémoire utilisable. Dans le pire des cas, il pourrait d'abord sembler avoir travaillé puis causer des problèmes plus tard.

Pour corriger, d'abord initialiser Temp xxx

puis obtenir la valeur souhaitée. Cela pourrait être fait avec la fonction que vous avez évidemment déjà découverte STRUP , mais c'est expérimental ou posix. C'est peut-être pour la raison pour laquelle vous n'avez pas utilisé. ( https://fr.cppreference.com/w/c/experimental/dynamic / strdup )

Pour utiliser ultérieurement strcpy () Vous devez d'abord obtenir une mémoire à utiliser pour cette opération. Si vous n'avez pas une variable normale pour recevoir la copie de la chaîne, vous pouvez utiliser masloc () , avec une taille appropriée que vous devez découvrir.

par Le chemin, strlwr () n'est pas une fucntion standard, donc je suis avec vous à ne pas l'utiliser. ( Référence non définie à `strlwr ')


0 commentaires