Как вернуть строку из функции C

Узнайте, как вернуть строку из функции C

В одной из моих программ на C у меня была задача вернуть строку из функции:

xxxxx myName() {
  return "Flavio";
}

Сложнее всего определить тип возвращаемого значения.

Струны в Cнаходятсямассивыизcharэлементов, поэтому мы не можем вернуть строку - мы должны вернуть указатель на первый элемент строки.

Вот почему нам нужно использоватьconst char*:

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

Вот пример рабочей программы:

#include <stdio.h>

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

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

Если вы предпочитаете присвоить результат переменной, вы можете вызвать функцию следующим образом:

const char* name = myName();

Мы можем написатьуказательоператор*также таким образом:

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

Все формы полностью действительны.

Обратите внимание на использованиеconst, потому что из функции я возвращаюстроковый литерал, строка, заключенная в двойные кавычки, которая является константой.

Обратите внимание, что вы не можете изменить строковый литерал в C.

Еще одна вещь, о которой следует помнить, заключается в том, что вы не можете вернуть строку, определенную как локальную переменную из функции C, потому что переменная будет автоматически уничтожена (освобождена), когда функция завершит выполнение, и, как таковая, она не будет доступна, если вы, например, попробуете сделать:

#include <stdio.h>

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

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

у вас будет предупреждение и треп, например:

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: