La función que devuelve el puntero a la cadena no funciona

Quiero saber por qué no funciona correctamente lo siguiente. Aunque he intentado las otras formas que funcionan, pero para mayor claridad, me gustaría saber el problema que está ocurriendo aquí.

char *fuc(char *s) { char t[10]; int r=0; while(s[r] != '\0') { t[r] = s[r]; r++; } t[r]='\0'; return &t[0]; } main() { char s[]="abcde"; char *p; p=func(s); puts(p); } 

En tu fuc() , char t[10]; Es una variable local. Una vez que tu función termina de ejecutarse, no hay existencia de t . Por lo tanto, en el llamador, el puntero devuelto se vuelve inválido.

El uso de ese puntero devuelto conduce a un comportamiento indefinido .

Si desea devolver el puntero desde fuc() , debe utilizar la función de asignación de memoria dinámica, como malloc() y familia. En ese caso, dentro de la función de la persona que llama, una vez que haya terminado de usar la memoria, también debe cuidar la memoria asignada de forma gratuita.

Dicho esto, desde el punto de vista lógico, dentro de tu fuc() , estás iterando sobre t sin ningún control en los límites . Debe verificar el tamaño de t antes de usar el índice.

Además, main() no es una forma adecuada de la función. Por lo menos, debe ser int main(void) .

La matriz t es local a la función func() así que una vez que salga de la función no podrá acceder a la matriz t lo que conducirá a un comportamiento indefinido.

Debe asignar memoria en el montón.

 char *t = malloc(10); 

Ahora puede devolver un puntero desde la función func()