時には、我々は正しい、関数は文字列を返す必要がありますが、文字列関数を定義することはできませんか?だから、ここで関数は、文字列を返すようにするいくつかの方法があります。
方法の一つ:グローバル変数
グローバル変数は、例のように、最も簡単な方法は、次のとおりです。
#include <stdio.h>
char chName[20];
void DoName()//使用全局变量的话就不必要设定函数类型了
{
//对chName的操作
...
return;
}
int main()
{
DoName();//执行对chName的操作
puts(chName);//输出chName的值
}
このようなアプローチの機能は何も返しませんが、効果は同じですが。
注意:あまりにも多くのグローバル変数を使用することをお勧めしません
方法2:スペースポインタやmalloc関数の動的割り当て
PS:malloc関数導入の使用のためにhttps://blog.csdn.net/ZouHuiDong/article/details/90415482
グローバルを使用しない場合は、変数、我々はまた、関数のポインタ型を定義することができます。
char *DoName()
次いでポインタ(関数で定義されたチャー*のchName仮定)を返します。
return chName;
しかし、そう単純ではない、機能を空にするために、関数の最後で定義された変数関数は、関数外の変数で使用することはできませんので。機能が実行されていない場合、スタック内のシステムに保存されている関数定義された変数、スタックはそのようなものです:
スタック |
---|
スタックのトップ - >プログラムに関するその他の情報... |
私は、関数を呼び出すようになりました。
スタック |
---|
スタックのトップ - > CHAR * DoName |
プログラムに関するその他の情報... |
* chNameをcharへの実行:
スタック |
---|
スタックのトップ - > CHAR * chName |
... |
シャア* Donme |
プログラムに関するその他の情報... |
関数が終了すると:
スタック |
---|
スタックのトップ - >プログラムに関するその他の情報... |
この時点で、機能は、ノー、ポップアップからの変数の関数定義を終了しました。ポインタを返し、その後、場合:
return chName;
あなたはポインタがスペースの面積を指している、知っている、というよりも機能が終わった場合、自分の価値を持って、関数ポインタへのポインタを返す静止領域を指し、空返すことと等価である、片でクリアされています。以下のような:
[機能]スタック操作 |
---|
スタック - >ポインタへ - > CHAR * chName |
... |
シャア* Donme |
プログラムに関するその他の情報... |
[スタック機能が終了し、機能定義された変数がクリアされています] |
---|
ポインタ- > |
スタックのトップ - >プログラムに関するその他の情報... |
したがって、この時間は、エリアに空きスペースをポインタを返す、それが役割を果たしていないでしょう。
だから、どのようにそれを解決するには?
主人公の持ちくださいmallocの演奏を!!
* ChNameは特別なスペースを申請するmalloc関数を使用することができます
chName = (char*)malloc(20);//给chName申请20的空间,相当于char chName[20]
その一つは、これはあなたと同じではないことを、頼むかもしれませんか?
これは、値がクリアされ、服用しないために他の場所で機能した後、関数内で同じ、一般的に定義された変数ではありません。しかし、スペースのアプリケーションはスタック上ではなく、関数として、malloc関数を使用しますが、杭の上に、私たちは、空の解放する必要があります。以下のような:
- 関数が実行されていません
スタック | ヒープ |
---|---|
スタックのトップ - >プログラムに関するその他の情報... |
- 関数は実行を開始します
スタック | ヒープ |
---|---|
スタックのトップ - > CHAR * DoName | |
プログラムに関するその他の情報... |
- 関数の操作
スタック | ヒープ |
---|---|
スタック - > chName =(CHAR *)のmalloc(20) | |
CHAR * chName | |
... | |
シャア* Donme | |
プログラムに関するその他の情報... |
- この関数は、ヒープ上の変数chNameと要求されたスペース、アプリケーションスペースを作成しました。
スタック | ヒープ |
---|---|
スタックのトップ - > ... | |
chName =(CHAR *)のmalloc(20) | |
CHAR * chName | |
... | |
シャア* Donme | |
プログラムに関するその他の情報... | ポインタ - > ...(数値) |
- 関数の最後、変数関数が作成されますがクリアされますが、空きヒープへのニーズは空にしますが、(自由に使用しないでください)、ヒープが空ではありません。
スタック | ヒープ |
---|---|
スタックのトップ - >プログラムに関するその他の情報... | ポインタ - > ...(数値) |
この場合、関数ポインタ* chNameを返し、それはスタックが空になったのではなく、ヒープの領域を指します。このポインタを受信する主な機能は、スタックから値を得ることに成功しました。
char *DoName()
{
...
char *chName;
chName = (char*)malloc(20);
...
return chName;
}
int main()
{
char getName[20] = DoName();
puts(getName);
return 0;
}
それだけです。
間違ったアプローチ
注意してください:一部の人々は、私は、文字列を返すと思うかもしれそれを好きではない、なぜ法のようなので、多くの問題を行いますか?
エラーコード:
char *DoName()
{
char chName[4] = {'D','a','v','\0'};
return chName;
}
int main()
{
char getName[4] = DoName();
puts(getName);
return 0;
}
したがって、値は、一見を得ることができる......「DAVは」ああ(「\ 0」は、文字列内のシンボルのストリングの終わりを示します)。
実際には、これはスタック何を空にしません、に対処するばかりで何も他の手順ではありません!今、あなたは得ることができますが、必ずしも他の場所で取得することができません。あなたがプログラムが何かを処理させる場合には、それはそれだけの価値はありませんので、この誤った慣行を使用しないでください。