Comment définir une référence de pointeur via une fonction

En C, j’essaie de définir la valeur d’un pointeur en l’envoyant à une fonction, mais la valeur ne changera pas en dehors de la fonction. Voici mon code:

#include  void foo(char* str) { char* new_str = malloc(100); memset(new_str, 0, 100); strcpy(new_str, (char*)"new test"); str = new_str; } int main (int argc, char *argv[]) { char* str = malloc(100); memset(str, 0, 100); strcpy(str, (char*)"test"); foo(str); printf("str = %s\n", str); } 

Je veux imprimer:

 str = new test 

mais ce code affiche:

 str = test 

Toute aide serait appréciée. Merci d’avance.

Il n’y a pas de référence par passe dans C. Si vous fournissez str comme argument d’une fonction dans C, vous transmettez toujours la valeur actuelle de str , jamais str lui-même.

Vous pouvez passer un pointeur à str dans la fonction:

 void foo(char** pstr) { // ... *pstr = new_str; } int main() { // ... foo(&str); } 

Comme le dit Eiko, votre exemple de code perd la première allocation de mémoire. Vous ne l’utilisez plus et vous n’avez plus d’indicateur, vous ne pouvez donc pas le libérer. C’est mauvais.

Vous devez utiliser le pointeur sur le pointeur, non testé:

 #include  void foo(char** str) { char* new_str = malloc(100); memset(new_str, 0, 100); strcpy(new_str, (char*)"new test"); if (str) { /* if pointer to pointer is valid then */ if (*str) /* if there is a previous ssortingng, free it */ free(*str); *str = new_str; /* return the ssortingng */ } } int main (int argc, char *argv[]) { char* str = malloc(100); memset(str, 0, 100); strcpy(str, (char*)"test"); foo(&str); printf("str = %s\n", str); } 

Vous venez de réaffecter un pointeur, qui est une variable locale dans foo.

Si vous voulez copier la chaîne, utilisez strcpy(str, new_str);

Vous pouvez passer une référence au pointeur et le réaffecter, mais cela peut facilement entraîner des memory leaks et est difficile à gérer.

Edit: Pour le pseudo-transfert par référence, voir la réponse de Steve.

Je l’ai fait de cette façon en renvoyant le pointeur de la fonction. Il n’y a aucune raison d’utiliser malloc dans ce cas, vous n’avez donc pas à vous soucier de la libération.

gcc 4.4.3 c89

 char* print_test(char *str) { char *new_str = "new_test"; printf("new_str [ %s ]\n", new_str); str = new_str; return str; } int main(void) { char *str = "test"; printf("str [ %s ]\n", str); str = print_test(str); printf("str [ %s ]\n", str); return 0; }