fonction renvoyant le pointeur sur la chaîne ne fonctionnant pas

Je veux savoir pourquoi ce qui suit ne fonctionne pas correctement? Bien que j’aie essayé d’autres méthodes qui fonctionnent, mais pour plus de clarté, j’aimerais connaître le problème qui se pose ici.

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

Dans votre fuc() , char t[10]; est une variable locale. Une fois que votre fonction a terminé son exécution, il n’existe plus de t . Ainsi, dans l’appelant, le pointeur renvoyé devient invalide.

L’utilisation de ce pointeur renvoyé conduit également à un comportement indéfini .

Si vous voulez renvoyer le pointeur depuis fuc() , vous devez utiliser la fonction d’allocation de mémoire dynamic, comme malloc() et la famille. Dans ce cas, dans la fonction appelant, une fois que vous avez utilisé la mémoire, vous devez également prendre soin de free() la mémoire allouée.

Cela dit, du sharepoint vue logique, à l’intérieur de votre fuc() , vous fuc() t sans aucune vérification des limites . Vous devriez vérifier la taille de t avant d’utiliser l’index.

De plus, main() n’est pas une forme appropriée de la fonction. Au moins, il devrait être int main(void) .

Le tableau t est local dans function func() donc une fois que vous avez quitté la fonction, vous ne pouvez plus accéder au tableau t ce qui conduit à un comportement indéfini.

Vous devriez allouer de la mémoire sur le tas.

 char *t = malloc(10); 

Maintenant, vous pouvez retourner un pointeur depuis la fonction func()