どのようにC言語の関数は文字列を返します。

著作権:ソースを明記してください!https://blog.csdn.net/ZouHuiDong/article/details/90452133

時には、我々は正しい、関数は文字列を返す必要がありますが、文字列関数を定義することはできませんか?だから、ここで関数は、文字列を返すようにするいくつかの方法があります。

方法の一つ:グローバル変数

グローバル変数は、例のように、最も簡単な方法は、次のとおりです。

#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
プログラムに関するその他の情報...

関数が終了すると:

スタック
CHAR * chName
...
シャア* Donme
スタックのトップ - >プログラムに関するその他の情報...

この時点で、機能は、ノー、ポップアップからの変数の関数定義を終了しました。ポインタを返し、その後、場合:

return chName;

あなたはポインタがスペースの面積を指している、知っている、というよりも機能が終わった場合、自分の価値を持って、関数ポインタへのポインタを返す静止領域を指し、空返すことと等価である、片でクリアされています。以下のような:

[機能]スタック操作
スタック - >ポインタへ - > CHAR * chName
...
シャア* Donme
プログラムに関するその他の情報...
[スタック機能が終了し、機能定義された変数がクリアされています]
ポインタ- > 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 *)の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」は、文字列内のシンボルのストリングの終わりを示します)。
実際には、これはスタック何を空にしません、に対処するばかりで何も他の手順ではありません!今、あなたは得ることができますが、必ずしも他の場所で取得することができません。あなたがプログラムが何かを処理させる場合には、それはそれだけの価値はありませんので、この誤った慣行を使用しないでください。

おすすめ

転載: blog.csdn.net/ZouHuiDong/article/details/90452133