/

如何從 C 函數中返回一個字符串

如何從 C 函數中返回一個字符串

了解如何從 C 函數中返回一個字符串

在我的一個 C 程序中,我需要在一個函數中返回一個字符串:

1
2
3
xxxxx myName() {
return "Flavio";
}

麻煩的是定義返回值的類型。

C 中的字符串char元素的數組,所以我們實際上無法直接返回一個字符串,而需要返回指向字符串第一個元素的指針。

這就是為什麼我們需要使用const char*的原因:

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

下面是一個示例工作程序:

1
2
3
4
5
6
7
8
9
#include <stdio.h>

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

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

如果你想將結果賦值給一個變量,可以這樣調用函數:

1
const char* name = myName();

我們可以以以下方式編寫指針運算符*

1
2
const char * myName()
const char *myName()

所有形式都是完全有效的。

請注意使用const,因為我從函數返回的是一個字符串文字,即以雙引號定義的字符串,它是一個常量。

請注意,在 C 中不能修改字符串文字。

還有一點要牢記的是,在 C 函數中不能返回定義為局部變量的字符串,因為變量在函數執行結束時會自動被銷毀(釋放),並且因此將不可用。如果你嘗試執行下面的代碼:

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

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

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

你會得到一個警告和一些亂碼,如下所示:

1
2
3
4
5
6
7
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()變為:

1
2
3
4
const char* myName() {
char *name = "Flavio";
return name;
}

這樣程序可以正常工作。

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