1
votes

Pourquoi est-ce que j'obtiens des résultats différents lorsque j'exécute ceci avec l'instruction d'impression commentée?

Je travaille sur des cours en ligne pour c et je trouve un résultat très étrange. Dans la fonction ci-dessous, j'obtiens les bonnes réponses lorsque je décommente l'instruction printf en bas. Cependant, lorsque j'exécute la fonction sans printf (), j'obtiens des résultats apparemment aléatoires.

J'imprime ce résultat dans une autre fonction. Je suppose que cela peut être quelque chose à voir avec le fait de ne pas définir le tableau comme utilisant des valeurs de corbeille, mais je suis ensuite en train de passer en revue et de définir chacun de ces éléments dans la boucle. quelqu'un me dirige dans la bonne direction?

c

5 commentaires

À moins de savoir exactement comment string est implémenté, nous ne pouvons pas faire grand-chose. Ce n'est pas une chose C standard.


@lordf C'est un très mauvais code avec un comportement indéfini. N'utilisez pas un tel cours.


characters [length + 1] = '\ 0'; Ceci écrit 1 caractère au-delà de la taille allouée, et ce n'est que le premier de plusieurs problèmes.


@dxiv est-ce? J'ai défini la taille comme longueur +1, puis j'ai donné la valeur de longueur +1 comme '\ 0'. Est-ce que je manque quelque chose?


Les index @lordf commencent à 0 en C. Les éléments (valides) de votre tableau vont de caractères [0] à caractères [longueur] .


3 Réponses :


0
votes
char * ciphercalc(char  *text, char *key) 
//  OR you want to use string type: char * ciphercalc(string  text, string key)
{
    size_t length = strlen(text);
    char *characters = malloc(length+1);

    //verify the return value of malloc function
    if(!characters) {return NULL;}
    int i;
    for (i = 0; i < 26 && i < length; i++) {
       // your code
    }

    characters[i] = '\0';
    return characters;
}

0 commentaires

1
votes

Renvoi du pointeur vers la variable locale "caractères" qui ne sera pas valide lors du retour.


3 commentaires

C'est un peu au-dessus de ma tête. Je ne fais que commencer avec C. Je pense que ce que vous dites est que lorsque j'imprime cette valeur retournée "endchar", il ne porte pas l'emplacement des "caractères" avec lui, donc il est effectivement indéfini ?. Lorsque je décommente la fonction d'impression, elle stocke les valeurs pour enchar et peut ensuite être récupérée lorsque j'utilise cette valeur retournée?


la valeur retournée endchar pointe vers les caractères mais lorsque vous revenez de ciphercalc, les caractères n'existent plus. vous pointez quelque part dans la mémoire de la pile qui pourrait contenir n'importe quoi. l'appel printf change juste aléatoirement l'alignement des choses dans la mémoire de la pile afin qu'il fonctionne par accident. variables automatiques google vs variables statiques


Merci pour l'explication. Ça a du sens. J'aurai une lecture.



0
votes

Vous ne pouvez pas renvoyer un pointeur vers une variable locale à partir d'une fonction. La mémoire utilisée pour stocker les variables locales est automatiquement libérée lorsque la fonction se termine et peut être réutilisée par d'autres fonctions.

Allouez la mémoire de manière dynamique:

void ciphercalc(string text, string key, char* characters, int max_characters)

et libérée lorsqu'elle n'est plus nécessaire (éventuellement dans une autre fonction):

free(characters)

Ou, passez le tableau de sortie à votre fonction avec vos arguments d'entrée:

char* characters = malloc(length + 1);

votre fonction doit s'assurer que le tableau de sortie est suffisamment grand avant d'y écrire.


0 commentaires