2010-02-09 8 views
1

Je dois passer un caractère * dans une fonction et lui attribuer une valeur de chaîne. Je peux correctement le définir comme une chaîne dans la fonction, mais il ne semble pas imprimer correctement dans la fonction qui a appelé la fonction char * en premier lieu.Fonction Char * (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); // 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 
+0

Est-ce ce devoir? Et vous n'appelez pas read() correctement. –

+0

Si vous mesurez des longueurs de chaîne, vous devez utiliser le type 'size_t' au lieu du type' int'. –

Répondre

2

Je viens de relire votre question.

Vous semblez avoir été touché par la valeur de passage, même s'il s'agit d'un pointeur. De plus, le bloc null est-il terminé?

14

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.

2

Vous devez passer un pointeur vers 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); 
0

Je suis entièrement d'accord avec la réponse affichée ci-dessus. Vous modifiez essentiellement la valeur du pointeur, vous devez donc passer la référence du pointeur. utilisez char ** à la place de char *.