Forum général.cherche-logiciel quand utiliser char * et quand utiliser un tableau

Posté par  .
Étiquettes : aucune
0
19
août
2005
Décidemment j'ai toujours le meme problème qui revient. Lorsque j'essaye d'écrire quelque chose dans une variable de type char * , j'ai un message d'erreur, on le faisant dans une variable de type char variable[128] ca marche, mais je ne sais pas comment retourner ce type de variable dans une fonction !!

Quelqu'un peut-il m'expliquer quelles sont les conditions pour utiliser char * ? et la differance avec l'utilisation d'un tableau ?
  • # C élémentaire

    Posté par  . Évalué à 3.

    En déclarant un char * tu déclares un pointeur sur un char. Néanmoins ce pointeur doit te servir à pointer sur un espace mémoire que tu te réserves.
    Pour ce faire tu peux par exemple utiliser malloc (voir man malloc) de la manière suivante: char * text = (char *) malloc(128); (sauf erreur de ma part, ce qui serait embêtant :p... j'me prends pas le temps de tester).
    Enfin bon, à la fin de ton processus tu libères la mémoire avec free (voir man 3 free) free(text);

    Enfin, l'adresse d'un tableau est toujours le nom de la variable tout seul ou en utilisant l'opérateur d'adressage sur la première cellule de ton tableau (eg. (en allemand) ou aka. (en anglais) &text[0])

    zog zog.
  • # malloc

    Posté par  . Évalué à 2.

    Avec variable[128] le compilateur alloue statiquement 128 emplacements mémoire.

    Avec char * variable, tu obtiens juste un pointeur non initialisé (donc qui ne pointe vers rien de particulier). Il faut explicitement allouer un espace mémoire pour ce pointeur et lui dire de pointer dessus :

    variable = malloc (128)

    L'avantage du char * est qu'on n'est pas obligé de connaitre la taille de l'espace mémoire à allouer au moment de la compilation ( on peut utiliser une variable) au contraire du tableau statique.


    Bons débuts en C !

    BeOS le faisait il y a 20 ans !

  • # Tentative d'explication

    Posté par  . Évalué à 3.

    char variable[128] déclare un tableau de type caractère et de longueur 128. L'espace nécessaire pour stocker les 128 caractères est réservé en mémoire.

    char *variable déclare un pointeur, c'est-à dire une variable qui est destinée à contenir une adresse mémoire. Pour l'instant cette variable n'est pas initialisée, par conséquent elle pointe vers une adresse complètement indéterminée. Si tu essais d'écrire quelquechose à l'adresse pointée par cette variable, tu vas quasi obligatoirement violer la protection mémoire et provoquer une Segmentation fault.

    Ces deux déclarations sont donc bien différentes. Là où il peut y avoir confusion, c'est dans l'usage qu'on peut faire d'un tableau. Je m'explique : dans le premier cas, lorsque tu fait référence à ton tableau par son seul nom variable, tu fait référence à un pointeur, comme dans le second cas, à la différence près que cette fois-ci ton pointeur est initialisé et pointe vers la zone mémoire qui a été réservée au moment de la déclaration.

    Précision : une fonction ne peut pas retourner un tableau. Elle peut par contre retourner un pointeur qui pourrait être l'adresse de ton tableau par exemple.
    • [^] # Re: Tentative d'explication

      Posté par  . Évalué à 2.

      Pour compléter tout ce qui a déjà été (bien) dis au dessus :

      A condition de savoir ce que l'on fait, on peut mélanger les notions de pointeur (char *) et tableau (char[]), puisque au niveau processeur, ceux sont des adresses mémoires vers les données.

      J'ai d'ailleurs fait ça pas plus tard qu'hier, pour pouvoir réallouer dynamiquement de la mémoire à un tableau, en le gérant comme un pointeur. Car avec la syntaxe char[128], la chaine de caractères ne pourra jamais être augmentée.
      Au contraire, sur un pointeur, on peut faire un realloc (voir man realloc) pour ajouter de la mémoire, tout en continuant à faire par exemple des boucles avec la notation char[i] pour parcourir le tableau. Ou faire char *++ sur un tableau.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.