Pointeur ou *pointeur en C++?

Résolu/Fermé
olivbarb Messages postés 303 Date d'inscription dimanche 5 août 2007 Statut Membre Dernière intervention 10 mars 2013 - 12 déc. 2007 à 21:42
 le père - 12 déc. 2007 à 22:56
Bonjour,

J'ai un soucis avec les pointeurs. Voici mon code

#include <iostream>
#include <string.h>

using namespace std;

int main(int argc, char *argv[])
{
    FILE *fichierOuvert = NULL;
    FILE *fichierCrypteOuvert = NULL;
    char fichier[100];
    char fichierCrypte[100];
    char mot[10] = {0};
    char *caract;
    int i = 0;
    char *caracCrypter;


    cout << "Quel est le nom du fichier a crypter?";
    cin >> fichier;

    cout << "Quel est le nom du fichier crypte ?";
    cin >> fichierCrypte;

    cout << "Quel est le mot qui servira a crypter ?";
    cin >> mot;


    fichierOuvert = fopen(fichier, "rb");
    fichierCrypteOuvert = fopen(fichierCrypte, "wb");

    if (fichierOuvert != NULL)
    {
        while(fread(caract, sizeof(char), 1, fichierOuvert))
        {
            if (mot[i] == '\0')
            {
                i = 0;
            }
            *caracCrypter = *caract ^ mot[i];
            fwrite(caracCrypter, sizeof(char), 1, fichierCrypteOuvert);
            i++;
        }
        fclose(fichierOuvert);
        fclose(fichierCrypteOuvert);
    }
    else
    {
        cout << "impossible d'ouvrir le fichier" << endl;
    }

    return EXIT_SUCCESS;
}



Ce qui me parait bizarre c'est que si je remplace caract et caracCrypter par des char et non plus des pointeurs sur char et que dans le code je mets &caract et &caracCrypter (et que je supprime les étoiles) je n'ai plus aucun soucis.

3 réponses

Bonsoir

Encore et toujours le problème des pointeurs non initialisés.
Un pointeur est fait pour contenir l'adresse d'une variable.
Pour pouvoir faire *pointeur=nombre, il faut que pointeur contienne l'adresse de quelque chose, sinon nombre va être mis où ???
Dans ton programme ci-dessus tu utilises carac et caractCrypter dans jamais les avoir initialisés. Tu vas donc écrire n'importe où dans la mémoire, ça plante.
Par contre quand tu définis carac comme un char, tu as défini une variable - un emplacement mémoire qui peut effectivement contenir un caractère, donc pas de problème pour écrire dedans. Quant aux fonctions fread et fwrite qui attendent un pointeur sur caractère, il faut leur donner non pas le caractère lui même, mais son adresse grâce à l'opérateur &
0
Même si j'initialise mes 2 pointeurs a NULL, cela ne change rien. De plus quand je défini char *caract = NULL, un emplacement mémoire est bien réservé. Emplacement qui ne contiendra qu'une adresse, non ?
0
quand je défini char *caract = NULL
0
pardon fausse manoeuvre

quand je défini char *caract = NULL tu réserves de la place pour un pointeur, mais il ne pointe sur aucune zone mémoire. Tu n'as pas réservé de place pour un caractère.
Il fait faire, entre autres possibilités :
caract = &caractere ( où caractère est déjà défini) ou
caract= malloc(sizeof(char)) (allocation dynamique) ou
caract = autreptr (où autreptr est un char * déjà initialisé)
0