2011-02-08 12 views
1

私は構造を作り、新しい構造自体を返す関数を持っています。構造体には数字の配列と、そこにいくつの数字があるかを示す整数が含まれます(これは配列のように機能します)。 私は一時的な構造体を作成し、それを返すmakeStructを持っています。 mainではこの関数を呼び出してmyNumbers構造体に割り当てます。 これは、関数内に構造体のインスタンスが作成され、myNumbersにコピーされてから削除されるという効果があります。私の仮定は正しいのですか?C:ポインタを持たないときに構造体にメモリを解放するには?

これは正しくコンパイルされているようですが、私の構造を指すポインターがないため、割り振られたメモリーを解放する方法がわかりません。どうすればメモリを解放できますか? はもうそれへのポインタを持っていないとき、構造体へのメモリを解放する方法

#include <stdlib.h> 
#include <stdio.h> 

typedef struct{ 
    int* numbers; /*array of numbers*/ 
    int crowd; /*crowd of numbers*/ 
} magicNums; 

magicNums makeStruct(int crowd){ 
    magicNums tempStruct, *struct_ptr=&tempStruct; /*my temp struct and its pointer*/ 
    struct_ptr=(magicNums*)malloc(sizeof(magicNums)); /*allocating memory for struct*/ 
    tempStruct.numbers=(int*)malloc(sizeof(int)*crowd); /*allocating memory for struct's numbers*/ 
    return tempStruct; 
} 

int main() { 
    magicNums myNumbers; 
    myNumbers=makeStruct(10); 
    /*magicNums *myNumbers_ptr=&myNumbers; This won't work    */ 
    /*free(myNumbers_ptr);     This won't work    */ 
    /*free(&myNumbers);      This won't work    */ 
    return 0; 
} 
+4

甘くて聖...このコードには何点も間違っています。 – Chowlett

+0

コメントは私の心を笑わせてくれました。私のコードがいかに恐ろしいか自慢してくれます! – Pithikos

答えて

0

幸い!それがどこにあるのかわからない場合、どうすればそれを解放することができますか?解決策:どこに置くかを覚えておいてください!

2

正しいですが、有効なポインタがないのでメモリを解放することはできません。メモリリークが正常に作成されました。

この関数から構造体ポインタを返す必要があり、値による構造体は返しません。

なぜこれのためにmalloc()を使用していますか?

+0

makeStructは構造体ポインタを返す必要はなく、値によって構造体を返すことができます。そして、構造体ポインタを返す場合、mallocを使用する理由を尋ねるのは意味がありません。構造体ポインタを返すことはmallocを使用していることを意味し、構造体値を返すことはmallocを使用しないことを意味します。 –

+0

関数は、それらのパラメータの1つまたはファイルスコープ変数などへのポインタを返すことができます。したがって、mallocはポインタを返すという唯一のケースではありません。それにかかわらず、値渡しの構造体を渡す機能は、プログラミングにおいて常に悪い習慣です。 – Lundin

0

私が見る限り、最初にmallocを入力する必要はありません。makeStructです。後でint main(void)で次に

(!)あなたの代わりにポインタを返す試し

free(myNumbers.numbers); 
1

を行うことができます。

magicNums* makeStruct(int crowd){ 
    magicNums *tempStruct = (magicNums*)malloc(sizeof(magicNums)); /*allocating memory for struct*/ 

    tempStruct->numbers=(int*)malloc(sizeof(int)*crowd); /*allocating memory for struct's numbers*/ 
    return tempStruct; 
} 

int main() { 
    magicNums *myNumbers; 
    myNumbers = makeStruct(10); 

    free(myNumbers->numbers); 
    free(myNumbers); 
    return 0; 
} 
+0

+1これははるかに良いです:) – jv42

+1

tempStruct->群集を設定することを忘れないでください – Ferruccio

0

構造体のコピーをメインプログラムに戻しながら、関数自体でクリーンアップを行うことがあります。その後、そのコピーへの参照があり、使用後にメモリを解放するために解放することができます。

編集:問題の多くがここにあります正確に何をしたいかもしれませんマルティンスの答えは、:)

1

を参照してください。 1つは、質問に答える - あなたはできません。しかし、それはここでは本当にあなたの問題ではない:

私はあなたの代わりにこれをしたいことを推測するつもりだ。そして、

magicNums* makeStruct(int crowd){ 
    magicNums *struct_ptr = 
     (magicNums*)malloc(sizeof(magicNums)); /*allocating memory for struct*/ 
    struct_ptr->crowd = crowd; 
    struct_ptr->numbers=(int*)malloc(sizeof(int)*crowd); /*allocating memory for struct's numbers*/ 
    return struct_ptr; 
} 

の主は、あなたが割り当てる必要はありません

int main() { 
    magicNums *myNumbers; 
    myNumbers = makeStruct(10); 

    free (myNumbers->numbers);   
    free (myNumbers); 

    return 0; 
} 
1

だろう構造体自体のメモリは、あなたのmakeStructは次のようになります:

magicNums makeStruct(int crowd) { 
    magicNums tempStruct; 
    tempStruct.numbers = (int *) malloc(sizeof(int) * crowd); 
    tempStruct.crowd = crowd; 
    return tempStruct; 
} 

tempStructが作成されていますが関数が返ってきたらスタックは自動的に解放され、関数はtempStructのコピーを作成して返します。

、あなたはこのようにそれを使用することができます:あなたの質問に答えるためには、「どのようにもうそれへのポインタを持っていないとき、構造体へのメモリを解放するために?」

int main() { 
    magicNums myNumbers; 
    myNumbers = makeStruct(10); 
    free(myNumbers.numbers); 
} 
4

できません。あなたのコードはメモリをリークします。

も意味がありません、あなたのコードの中しかし、多くのエラーがあります

magicNums tempStruct, *struct_ptr=&tempStruct; 
struct_ptr=(magicNums*)malloc(sizeof(magicNums)); 

上記二行最初のセットstruct_ptr =&tempStruct。後でそのポインタをmallocからの戻り値に置き換えます。 2行はまったく同じ結果を達成します:

magicNums tempStruct; 
magicNums *struct_ptr; 
struct_ptr=(magicNums*)malloc(sizeof(magicNums)); 

これは、何が起こっているかをより明確にするかもしれません。

return tempStruct;

ここでtempStructを返すと、struct_ptrへのポインタが失われているため、解放することができず、メモリがリークします。

ただし、tempStruct.numbersへのポインタは失われていません。あなたのメインでそれを解放することができます

magicNums myNumbers; 
myNumbers=makeStruct(10); 
free(myNumbers.numbers); 

magicNumsは、ポインタではありません、あなたがすることはできませんし、それを解放する必要はありません。あなたは構造体を値で返しているので、大丈夫です。そこには動的なメモリはありません。

+0

私は完全に構造体がメモリ割り当てを必要としないことを忘れています。私は私の運動を終わらせるためにストレスの下であまりにも多くのコーディングをしていると思います。どうもありがとう!! – Pithikos

+0

ちょっと頭に浮かんだ質問がありました..もし私の構造体が内部のポインタへのポインタを持っていれば、実質的には2倍の配列になります。makeStruct()の外で両方のポインタを解放することはできますか? – Pithikos

0

ここには、自分の考えていることの説明に一致するコードがあります。それがあなたがしたいことであるかどうか、私は知らない。

#include <stdlib.h> 
#include <stdio.h> 

typedef struct{ 
    int* numbers; /*array of numbers*/ 
    int crowd; /*crowd of numbers*/ 
} magicNums; 

magicNums makeStruct(int crowd){ 
    magicNums tempStruct; 
    tempStruct.crowd = crowd; 
    tempStruct.numbers = malloc(sizeof(*tempStruct.numbers)*crowd); 
    return tempStruct; 
} 

int main(void) { 
    magicNums myNumbers = makeStruct(10); 
    free(myNumbers.numbers); 
    return 0; 
} 
+0

私はFerrucioが一時間早くほぼ同じことを発表したことを知りました。 –

関連する問題