如何从C函数中返回一个字符串

383 阅读2分钟

学习如何从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���⏎

注意结尾处的B��Z> K���⏎ 行,这表明最初被字符串占用的内存现在已经被清空了,在该内存中还有其他随机数据。所以我们没有拿回原来的字符串。

myName() 改为

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

可以使程序正常工作。

原因是默认情况下,变量是在堆栈中分配的。但是声明一个指针,指针指向的值就被分配在上,当函数结束时,堆不会被清除。