2016-05-16 19 views
6

私はCの構造体とデータ型に質問があります。いつCの空きメモリ構造体

struct test 
{ 
    char* c; 
    char* c2; 
}; 

そして、私は、関数からこの構造体を返していますが:

struct test a() 
{ 
    struct test t = { "yeah!", "string" }; 
    return t; 
} 

私の質問は、構造体のメモリを自動的に解放されているかどうか私はこれをしなければならない場合、私は、構造体がtestと呼ばれてい手動でfree()を介して

[更新from comment:]

関数AがDLLであると私はメインプログラムで構造体を使用したいです。

+0

ポインタを理解するのに適した場所:http://cslibrary.stanford.edu/104/ – Chintan

+3

_Automatically_。完了しました。 –

+0

「解放」とは何を理解していますか? –

答えて

3

TL/DRバージョン:手動では必要ありませんfree何か;この構造体インスタンスをスカラー変数を扱う方法で扱うことができます。

わずかに長いバージョン:構造体インスタンスtは、その寿命がa機能の寿命にわたって延びている意味、自動保管期間を有します。 aが終了すると、tに割り当てられたメモリが解放されます。 A tの内容のが発信者に返されます。

cc2文字列リテラルを指しているその内容については

...。文字列リテラルは、プログラムの実行全体にわたってそのライフタイムが延びるように割り当てられます。したがってがaから返された後にcc2のポインタ値が有効になります。実際、これらのポインタ値はプログラムの存続期間にわたって有効になります。

malloccalloc、またはreallocを介して割り当てられたものには、freeを電話する必要があります。

5

free最初にmalloc(他の同様の機能を使用する)ものを使用してください。何もなかったのでmalloc ed、何もないfree dであるはずです。

+1

しかし、どれくらい長く構造体を使用できますか?関数 'a'はDLLにあり、私はメインプログラムで構造体を使いたいです。どのようにコンパイラは構造体を削除するかを知っていますか? –

+0

'return t'を実行すると、コンパイラは構造体をコピーするためにmemcopyを使用します。 残念ながら、DLLは文字列リテラル(" yeah! "、" string ")を使用してデータを返すというひどい仕事をしています。これらのライフタイムは通常、ほとんどのシステムでDLLがメモリ上にある限り、返されるメモリはほとんど使用できません。より良い解決策は、ヒープに割り当て、文字列のコピーを行い、次に構造体を返すことです。構造体で終わったら、呼び出し元に空きを行います。 – Chintan

+0

@チンタンこのような保証はありません。構造体の戻り値は、レジスタなどに存在する可能性があります。 –

0

非動的割り当てを解放する必要はありません。それにもかかわらず、他の関数で構造体を使用したい場合は、構造体のアドレスを渡して構造体*として取得する必要があります。そうでなければ、再度使用することはできません。

+1

本当ではありません。 Structsは値で渡すことができます(この場合は値渡し)。 –

+0

私はそれを否定しません。だから何もしないでくださいdownvoteを停止します。 –

+1

あなたの答えは明らかにその陳述と矛盾しています。 –