了解如何從 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;
}

這樣程序可以正常工作。

這是因為變量默認分配在堆棧上。但是,當聲明一個指針時,指針所指向的值是分配在上的,當函數結束時,堆上的內存不會被清除。