Fonction Char * (pointeur)

Je dois transmettre un caractère * dans une fonction et le définir sur une valeur cssortingng. Je peux correctement le définir en tant que chaîne dans la fonction, mais cela ne semble pas s’imprimer correctement dans la fonction qui a appelé la fonction char * en premier lieu.

int l2_read(char *chunk,int length) { chunk = malloc( sizeof(char) * length); int i; for(i = 0; i < length; i++){ char c; if(read(&c) < 0) return (-1); // this gets a single character chunk[i] = c; } printf("%s",chunk); // this prints fine return 1; } // main char *string; int value = l2_read(string,16); printf("%s",chunk); // prints wrong 

En C, tout est passé par valeur. Une règle générale à retenir est que vous ne pouvez pas modifier la valeur d’un paramètre transmis à une fonction. Si vous voulez passer quelque chose qui doit changer, vous devez lui passer un pointeur.

Donc, dans votre fonction, vous voulez changer de chunk . chunk est char * . Pour pouvoir changer la valeur du caractère char * , vous devez passer un pointeur sur celle-ci, c’est-à-dire, caractère char ** .

 int l2_read(char **chunkp, int length) { int i; *chunkp = malloc(length * sizeof **chunkp); if (*chunkp == NULL) { return -2; } for(i = 0; i < length; i++) { char c; if (read(&c) < 0) return -1; (*chunkp)[i] = c; } printf("%s", *chunkp); return 1; } 

puis dans main() :

  char *ssortingng; int value = l2_read(&ssortingng, 16); if (value == 1) { printf("%s", ssortingng); /* corrected typo */ free(ssortingng); /* caller has to call free() */ } else if (value == -2) { /* malloc failed, handle error */ } else { /* read failed */ free(ssortingng); } 

Passe-à-valeur en C est la raison pour laquelle strtol() , strtod() , etc., ont besoin du paramètre char **endptr au lieu de char *endptr - ils veulent pouvoir définir la valeur char * avec l'adresse premier caractère invalide, et la seule façon d’affecter un caractère char * à l’appelant est de recevoir un pointeur sur ce dernier, c’est-à-dire de recevoir un caractère char * . De même, dans votre fonction, vous souhaitez pouvoir modifier une valeur char * , ce qui signifie que vous avez besoin d'un pointeur sur un caractère char * .

J'espère que cela pourra aider.

Je viens de relire votre question.

Vous semblez avoir été touché par la valeur passe par valeur, même s’il s’agit d’un pointeur, d’un problème. En outre, le bloc null est-il terminé?

Vous devez passer un pointeur à un pointeur.

 int l2_read(char **chunk,int length) { *chunk = malloc( sizeof(char) * length); int i; for(i = 0; i < length; i++) { char c; if (read(&c) < 0) return (-1); (*chunk)[i] = c; } printf("%s",*chunk); return 1; } char *string; int value = l2_read(&string,16); printf("%s",string); 

Je suis totalement d’accord avec la réponse affichée ci-dessus. Vous modifiez essentiellement la valeur du pointeur, vous devez donc lui transmettre la référence. utilisez char ** au lieu de char *.