Cómo establecer la referencia del puntero a través de una función

En C, estoy intentando establecer el valor de un puntero enviándolo a una función, pero el valor no cambiará fuera de la función. Aquí está mi código:

#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); } 

Quiero imprimir:

 str = new test 

pero este código se imprime:

 str = test 

Cualquier ayuda será apreciada. Gracias por adelantado.

No hay paso por referencia en C. Si proporciona str como el argumento de una función en C, siempre está pasando el valor actual de str , nunca str sí mismo.

Podrías pasar un puntero a str en la función:

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

Como dice Eiko, su código de ejemplo pierde la primera asignación de memoria. Ya no lo estás utilizando, y ya no tienes un puntero, por lo que no puedes liberarlo. Esto es malo.

Necesitas usar el puntero al puntero, sin probar:

 #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 string, free it */ free(*str); *str = new_str; /* return the string */ } } 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); } 

Solo estás reasignando un puntero, que es una variable local en foo.

Si desea copiar la cadena, use strcpy(str, new_str);

En su lugar, podría pasar una referencia al puntero y reasignar, pero esto puede provocar fácilmente pérdidas de memoria y es difícil de mantener.

Edición: Para la pseudo pasada por referencia, vea la respuesta de Steve.

Lo hice de esta manera devolviendo el puntero de la función. No hay razón para usar malloc en este caso, por lo que no tiene que preocuparse por la liberación.

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; }