Cómo devolver una cadena de una función C

Aprenda a devolver una cadena de una función C

En uno de mis programas en C, tuve la tarea de devolver una cadena de una función:

xxxxx myName() {
  return "Flavio";
}

Lo complicado es definir el tipo de valor de retorno.

Cadenas en Csonmatricesdecharelementos, por lo que realmente no podemos devolver una cadena; debemos devolver un puntero al primer elemento de la cadena.

Es por eso que necesitamos usarconst char*:

const char* myName() {
  return "Flavio";
}

Aquí hay un programa de trabajo de ejemplo:

#include <stdio.h>

const char* myName() {
  return "Flavio";
}

int main(void) { printf("%s", myName()); }

Si prefiere asignar el resultado a una variable, puede invocar la función de esta manera:

const char* name = myName();

Podemos escribir elpunterooperador*también de esta manera:

const char * myName()
const char *myName()

Todas las formas son perfectamente válidas.

Tenga en cuenta el uso deconst, porque de la función estoy devolviendo unliteral de cadena, una cadena definida entre comillas dobles, que es una constante.

Tenga en cuenta que no puede modificar un literal de cadena en C.

Otra cosa a tener en cuenta es que no puede devolver una cadena definida como una variable local desde una función C, porque la variable se destruirá (liberará) automáticamente cuando la función termine de ejecutarse y, como tal, no estará disponible. si, por ejemplo, intentas hacer:

#include <stdio.h>

const char* myName() {
  char name[6] = "Flavio";
  return name;
}

int main(void) { printf("%s", myName()); }

tendrás una advertencia y algunas bromas, como esta:

hello.c:5:10: warning: address of stack memory
      associated with local variable 'name'
      returned [-Wreturn-stack-address]
  return name;
         ^~~~
1 warning generated.
B��Z> K���⏎

Notice the B��Z> K���⏎ line at the end, which indicates that the memory that was first taken by the string now has been cleared and there’s other random data in that memory. So we don’t get the original string back.

Changing myName() to

const char* myName() {
  char *name = "Flavio";
  return name;
}

makes the program work fine.

The reason is that variables are allocated on the stack, by default. But declaring a pointer, the value the pointers points to is allocated on the heap, and the heap is not cleared when the function ends.

Download my free C Handbook


More clang tutorials: