Malloc en función – error de segmentación

Este progtwig funciona perfectamente:

#include  #include  #include  #define MAX_NUM 2 int tempfunction (char **comments) { char str1[]="First string\n"; char str2[]="This is the second string\n"; *(comments+0)=(char *) malloc(strlen(str1)+1); *(comments+1)=(char *) malloc(strlen(str2)+1); strcpy(*(comments+0), str1); strcpy(*(comments+1), str2); return 0; } int main(void) { char **comments; /* This is the section I am talking about */ comments=(char **) malloc(MAX_NUM*sizeof(char *)); if (comments==NULL) { printf("\n### ERROR: malloc failed.\n"); exit(EXIT_FAILURE); } /* Upto here............................. */ tempfunction(comments); printf("%s%s", comments[0], comments[1]); return 0; } 

Pero para una futura conveniencia, me gustaría poner la sección malloc dentro de la función tempfunction . Cuando hago eso, me sale un error de error de segmentación.

Pensé que podría deberse a la inicialización, así que en lugar de los char **comments; de char **comments; Yo escribo:

 char a = 'a'; char *P = &a; char **comments = &P; 

Pero, todavía no funciona. Le agradecería mucho que me ayudara a comprender por qué sucede esto y cómo solucionarlo.

Tratar:

 int tempfunction (char ***comments) { char str1[]="First string\n"; char str2[]="This is the second string\n"; *comments = malloc(MAX_NUM * sizeof(**comments)); /* you must check the return of malloc */ (*comments)[0] = strdup(str1); (*comments)[1] = strdup(str2); return 0; } 

y tu lo llamas asi

 tempfunction(&comments); 

Por supuesto, tendrás que liberar al final para evitar pérdidas de memoria.

Si desea cambiar los comments dentro de una función, tendrá que pasar la dirección de la misma, para que se refleje adecuadamente. Así que necesitas pasar &comments ejemplo, char *** to tempfunction() .

Yo sugeriría actualizar el código como:

 int tempfunction (char ***ref_comments) { char str1[]="First string\n"; char str2[]="This is the second string\n"; char **comments = malloc(MAX_NUM*sizeof(char *)); *(comments+0)=(char *) malloc(strlen(str1)+1); *(comments+1)=(char *) malloc(strlen(str2)+1); strcpy(*(comments+0), str1); strcpy(*(comments+1), str2); //now update the passed variable *nef_comments = comments; return 0; } int main(void) { char **comments; /* This is the section I am talking about */ comments=(char **) malloc(MAX_NUM*sizeof(char *)); if (comments==NULL) { printf("\n### ERROR: malloc failed.\n"); exit(EXIT_FAILURE); } /* Upto here............................. */ // pass address of comments tempfunction(&comments); printf("%s%s", comments[0], comments[1]); return 0; } 

No pase los comentarios de char ** de la función principal. En lugar de hacer esto, puede declarar los comentarios de char ** dentro de la función temporal y luego devolver la referencia de los comentarios a la función principal. Funcionará.