了解如何從 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;
}
這樣程序可以正常工作。
這是因為變量默認分配在堆棧上。但是,當聲明一個指針時,指針所指向的值是分配在堆上的,當函數結束時,堆上的內存不會被清除。