学习如何从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;
}
可以使程序正常工作。
原因是默认情况下,变量是在堆栈中分配的。但是声明一个指针,指针指向的值就被分配在堆上,当函数结束时,堆不会被清除。