En C, tout est passé en valeur. Une règle générale à retenir est la suivante: 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. Ainsi, dans votre fonction, vous souhaitez modifier chunk
. chunk
est char *
. Pour pouvoir modifier la valeur du char *
, vous devez passer un pointeur sur celui-ci, c'est-à-dire 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 *string;
int value = l2_read(&string, 16);
if (value == 1) {
printf("%s", string); /* corrected typo */
free(string); /* caller has to call free() */
} else if (value == -2) {
/* malloc failed, handle error */
} else {
/* read failed */
free(string);
}
passe par valeur C est la raison pour laquelle strtol()
, strtod()
, etc., ont besoin char **endptr
paramètre au lieu de char *endptr
— ils veulent pouvoir définir la valeur char *
à l'adresse du premier caractère invalide, et la seule façon dont ils peuvent affecter un char *
dans l'appelant est de recevoir un pointeur, c'est-à-dire, de recevoir un char *
. De même, dans votre fonction, vous voulez pouvoir modifier une valeur char *
, ce qui signifie que vous avez besoin d'un pointeur vers un char *
.
Espérons que ça aide.
Est-ce ce devoir? Et vous n'appelez pas read() correctement. –
Si vous mesurez des longueurs de chaîne, vous devez utiliser le type 'size_t' au lieu du type' int'. –