Puis-je retourner un tampon créé dans des fonctions?

char * return_buffer() { char buffer[1024]; snprintf(buffer, sizeof(buffer), "%s", "test"); return buffer; } 

le tampon est créé dans la fonction, puis-je retourner le tampon directement? après le retour de la fonction, le tampon disparaîtrait?

Vous créez un tampon alloué statiquement, ce qui signifie qu’il est créé sur la stack. Lorsque la fonction revient, elle vous donnera une adresse sur la stack qui n’est plus utilisée. Donc, si vous effectuez plus d’appels de fonction, les données qu’il stocke seront probablement corrompues.

Il vaut bien mieux l’allouer au tas en appelant malloc.

Vous devrez allouer le tampon sur le tas en utilisant malloc .
buffer est une variable locale / automatique et il n’est pas garanti que ce dernier existe après que la fonction a été renvoyée. L’utilisation d’un tel tampon au-delà de la scope de la fonction entraînera un comportement non défini.

Oui. Ce tampon est une variable locale utilisant la stack et sera libéré une fois que vous aurez quitté la fonction. Utilisez malloc pour allouer un tampon de mémoire dynamic.

Dans ce cas, non, vous ne pouvez pas. Plus comme vous pouvez mais vous ne devriez pas faire cela. Ici, le buffer est créé sur une stack qui sera réutilisée.

Vous pouvez revenir lorsque vous allouez avec malloc ou des fonctions similaires.

Ce n’est pas possible et peut provoquer un crash. Ici, la mémoire est allouée sur la stack et une fois que la fonction retourne, la mémoire sera libérée. Si vous voulez renvoyer le tampon d’une fonction, vous devez allouer de la mémoire sur le tas. Vous pouvez utiliser malloc / calloc pour cela. Lire plus

Non, vous ne pouvez pas renvoyer de pointeurs sur des variables locales.

Le meilleur moyen d’écrire de telles fonctions est de laisser l’atsortingbution à l’appelant. Les avantages sont les suivants: 1) le code est indépendant de la méthode d’allocation de mémoire et peut être utilisé à la fois avec de la mémoire allouée de manière statique et dynamic; et ne vous préoccupez pas de tâches secondaires sans rapport avec l’algorithme lui-même, telles que l’allocation de mémoire.

Ce type de conception de programme est très courant (par exemple, il est utilisé par l’API Windows).

Exemple:

 void print_buffer (char* buffer, size_t size) { snprintf(buffer, size, "%s", "test"); }