掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.26417

メモリの解放と削除の構文の何が駄目なのかわからない
投稿者---初めて8日目です Aです(2006/03/16 00:55:47)


どうもすみません。
まだ始めたばかりでよくわかってないので迷惑かけます
症状は削除を行う際にエラーが出てしまいます。
ひとつ作業をしたらメモリーを解放したいんですがどうしたらいいのかがわからないんです。main関数の最後に入れるみたいなんです・・・
どこがいけないのか教えてください


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

struct MEMBER {
    int  ID;
    char Name[32];
    int  Age;
    struct MEMBER *next;
};

struct MEMBER *nyuuryoku(struct MEMBER *fin,struct MEMBER *head);
void itiranhyou(struct MEMBER *head);
struct MEMBER *sakujo(struct MEMBER *head, struct MEMBER *fin);

int main(void) 
{
    int w = 0;
    struct MEMBER dmy;
    struct MEMBER *head = &dmy;
    struct MEMBER *fin;
    
    head = &dmy;
    head->next = NULL;
    fin = head;

        while (1){
            printf("<メニュー>\n1:追加\n2:一覧\n3:削除\n99:END\n\nNO?\n");
        scanf_s("%d", &w);
        if(w == 1){
            /*meb [i] =*/
            fin = nyuuryoku(fin,head);
            //i++;

        }
        else if(w == 2){
            itiranhyou(head);
        }
        else if(w == 3){ 
            fin = sakujo(head,fin);
        }
        else if(w == 99){
            break;
        }

        }
}
/*データ入力*/
struct MEMBER *nyuuryoku(struct MEMBER *fin,struct MEMBER *head){

    struct MEMBER *a;
    struct MEMBER *g;

    if((a = (struct MEMBER*)malloc(sizeof(struct MEMBER)))==NULL){       /*メモリの確保*/
            printf("確保失敗\n");
        }
            printf("ID?");
            scanf_s("%d", &a->ID);
            for(g = head->next; g!=NULL; g = g->next){
                if(g->ID == a->ID){
                free(a);
                return fin;
                }
            }
            printf("名前?");
            scanf_s("%s", a->Name,31);
            printf("年齢?");
            scanf_s("%d", &a->Age);
            
            
                
                a->next = NULL;
                fin->next = a;
                fin = a;
            
                return fin;
}
/*一覧表示*/
void itiranhyou(struct MEMBER *head){

    struct MEMBER *c;

  printf("ID     名前     年齢\n");
    for(c = head->next; c!=NULL; c = c->next) {
          printf("%d     %s     %d\n", c->ID, c->Name, c->Age);
    }
}
/*削除*/
struct MEMBER *sakujo(struct MEMBER *head, struct MEMBER *fin){
    struct MEMBER *k;
    struct MEMBER *l;
    int m = 0;

    printf("ID?\n");
    scanf_s("%d", &m);
    
    for(k = head; k->next !=NULL; k = k->next){
        if(k->next->ID == m){
            l = k->next;
            k->next = k->next->next;
            if(fin->ID == m){
                fin = k;
            }
        }
            free(l);
            return fin;
        }
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:メモリの解放と削除の構文の何が駄目なのかわからない 26420 Blue 2006/03/16 09:21:21
<子記事> Re:メモリの解放と削除の構文の何が駄目なのかわからない 26422 REE 2006/03/16 10:08:56
<子記事> Re:メモリの解放と削除の構文の何が駄目なのかわからない 26534 shu 2006/03/29 18:59:52


No.26420

Re:メモリの解放と削除の構文の何が駄目なのかわからない
投稿者---Blue(2006/03/16 09:21:21)


環境がまだ明示されていませんが、
> sacanf_s
から VC++2005 Express あたりでしょうか?

結論から言うと、main文の終了前に、mallocした領域を全て削除する処理が必要です。

一例)

void all_sakujo( struct MEMBER* head )
{
    struct MEMBER* a;
    struct MEMBER* b;
    
    for ( a = head->next; a != NULL; a = b )
    {
        b = a->next;
        free( a );
    }
}

※未コンパイル

ついでに、nyuuryoku関数で、mallocに失敗した場合は、そこで処理を切り上げる必要があります。
> printf("確保失敗\n");
の下で return fin; とすべきかと。


この投稿にコメントする

削除パスワード

No.26421

Re:メモリの解放と削除の構文の何が駄目なのかわからない
投稿者---RingBuffer(2006/03/16 09:32:14)


VCの環境が無いので、
scanf_s をscanfに変更してgccでコンパイルしたら
表示位置を除いたら期待通りの動作をします。

もう少しじゃないですか?
解決策はVC環境の方に任せます。


この投稿にコメントする

削除パスワード

No.26424

Re:メモリの解放と削除の構文の何が駄目なのかわからない
投稿者---Aです(2006/03/16 11:07:32)


>環境がまだ明示されていませんが、
>> sacanf_s
>から VC++2005 Express あたりでしょうか?
>
>結論から言うと、main文の終了前に、mallocした領域を全て削除する処理が必要です。
>
>一例)
>
<pre><font color="blue">void</font> all_sakujo( <font color="blue">struct</font> MEMBER* head )
{
<font color="blue">struct</font> MEMBER* a;
<font color="blue">struct</font> MEMBER* b;

<font color="blue">for</font> ( a = head->next; a != NULL; a = b )
{
b = a->next;
free( a );
}
}</pre>
>※未コンパイル
>
>ついでに、nyuuryoku関数で、mallocに失敗した場合は、そこで処理を切り上げる必要があります。
>> printf("確保失敗\n");
>の下で return fin; とすべきかと。

添付したソースだとどの変に、どのように入れたらいいのか今一つわからないんですが・・・すみませんが教えていただけませんか


この投稿にコメントする

削除パスワード

No.26422

Re:メモリの解放と削除の構文の何が駄目なのかわからない
投稿者---REE(2006/03/16 10:08:56)


>どうもすみません。
>まだ始めたばかりでよくわかってないので迷惑かけます
>症状は削除を行う際にエラーが出てしまいます。
>ひとつ作業をしたらメモリーを解放したいんですがどうしたらいいのかがわからないんです。main関数の最後に入れるみたいなんです・・・
>どこがいけないのか教えてください

sakujoの中のfreeの位置が悪いです。
正しくインデントされていないから分かりにくいかもしれませんが、
IDとmが一致していない時にまで、freeを実行してしまっています。
そのときのlの値は不定です。


この投稿にコメントする

削除パスワード

No.26423

Re:メモリの解放と削除の構文の何が駄目なのかわからない
投稿者---Aです(2006/03/16 11:02:44)


>>どうもすみません。
>>まだ始めたばかりでよくわかってないので迷惑かけます
>>症状は削除を行う際にエラーが出てしまいます。
>>ひとつ作業をしたらメモリーを解放したいんですがどうしたらいいのかがわからないんです。main関数の最後に入れるみたいなんです・・・
>>どこがいけないのか教えてください
>
>sakujoの中のfreeの位置が悪いです。
>正しくインデントされていないから分かりにくいかもしれませんが、
>IDとmが一致していない時にまで、freeを実行してしまっています。
>そのときのlの値は不定です。

ソースのどの部分を具体的にはどのように変えたらいいのですか
教えていただけませんか。まだ始めたばかりでよくわからないのでよろしくお願いします


この投稿にコメントする

削除パスワード

No.26425

Re:メモリの解放と削除の構文の何が駄目なのかわからない
投稿者---Blue(2006/03/16 11:30:54)


なぜ?あなたが書いたソースではないのでしょうか?
あのソースがかけるのならば、とても簡単な作業だと思いますけど。

> 課題の丸投げはしません。

に反しているようならば、レスはつきませんよ。


この投稿にコメントする

削除パスワード

No.26427

Re:メモリの解放と削除の構文の何が駄目なのかわからない
投稿者---Aです(2006/03/16 12:10:38)


>なぜ?あなたが書いたソースではないのでしょうか?
>あのソースがかけるのならば、とても簡単な作業だと思いますけど。
>
>> 課題の丸投げはしません。
>
>に反しているようならば、レスはつきませんよ。
教わりながら作ったので一人で作ったわけじゃないんです
すみません。何とかできたんですがこれでいいんですか?
自分でも理解できてない部分がまだあるのでよろしくお願いします
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct MEMBER {
    int  ID;
    char Name[32];
    int  Age;
    struct MEMBER *next;
};

struct MEMBER *nyuuryoku(struct MEMBER *fin,struct MEMBER *head);
void itiranhyou(struct MEMBER *head);
struct MEMBER *sakujo(struct MEMBER *head, struct MEMBER *fin);

int main(void) {
    int w = 0;
    struct MEMBER dmy;
    struct MEMBER *head = &dmy;
    struct MEMBER *fin;
    
    head = &dmy;
    head->next = NULL;
    fin = head;

        while (1){
            printf("<メニュー>\n1:追加\n2:一覧\n3:削除\n99:END\n\nNO?\n");
        scanf_s("%d", &w);
        if(w == 1){
            /*meb [i] =*/
            fin = nyuuryoku(fin,head);
            //i++;
        }
        else if(w == 2){
            itiranhyou(head);
        }
        else if(w == 3){ 
            fin = sakujo(head,fin);
        }
        else if(w == 99){
            break;
        }
        }
        void all_re(struct MEMBER *fin, struct MEMBER *head){
            struct MEMBER *j;
            struct MEMBER *o;
            for(j = head->next; j != NULL; j = o){
                o = j->next;
                free(j);
            }
        }
}

/*データ入力*/
struct MEMBER *nyuuryoku(struct MEMBER *fin,struct MEMBER *head){

    struct MEMBER *a;
    struct MEMBER *g;

    if((a = (struct MEMBER*)malloc(sizeof(struct MEMBER)))==NULL){       /*メモリの確保*/
            printf("確保失敗\n");
            return fin;
        }
            printf("ID?");
            scanf_s("%d", &a->ID);
       for(g = head->next; g!=NULL; g = g->next){
                if(g->ID == a->ID){
                free(a);
                return fin;
                }
            }
            printf("名前?");
            scanf_s("%s", a->Name,31);
            printf("年齢?");
            scanf_s("%d", &a->Age);
            
            
                
                a->next = NULL;
                fin->next = a;
                fin = a;
            
                return fin;





この投稿にコメントする

削除パスワード

No.26426

Re:メモリの解放と削除の構文の何が駄目なのかわからない
投稿者---wis(2006/03/16 11:37:25)


>ソースのどの部分を具体的にはどのように変えたらいいのですか
>教えていただけませんか。まだ始めたばかりでよくわからないのでよろしくお願いします
インデントがおかしいので混乱しているだけでは?
    for(k = head; k->next !=NULL; k = k->next){
        if(k->next->ID == m){
            l = k->next;
            k->next = k->next->next;
            if(fin->ID == m){
                fin = k;
            }
        }
    //ここはfor文の中で常に実行される
        free(l);
        return fin;
    }





この投稿にコメントする

削除パスワード

No.26428

Re:メモリの解放と削除の構文の何が駄目なのかわからない
投稿者---Aです(2006/03/16 13:33:31)


>>ソースのどの部分を具体的にはどのように変えたらいいのですか
>>教えていただけませんか。まだ始めたばかりでよくわからないのでよろしくお願いします
>インデントがおかしいので混乱しているだけでは?
><pre> for(k = head; k->next !=NULL; k = k->next){
if(k->next->ID == m){
l = k->next;
k->next = k->next->next;
if(fin->ID == m){
fin = k;
}
}
    //ここはfor文の中で常に実行される
free(l);
return fin;
}


</pre>
ということはこういうことですか
<pre>/*削除*/
struct MEMBER *sakujo(struct MEMBER *head, struct MEMBER *fin){
struct MEMBER *k;
struct MEMBER *l;
int m = 0;

printf(&quot;ID?\n&quot;);
scanf_s(&quot;%d&quot;, &amp;m);

for(k = head; k-&gt;next !=NULL; k = k-&gt;next){
if(k-&gt;next-&gt;ID == m){
l = k-&gt;next;
k-&gt;next = k-&gt;next-&gt;next;
if(fin-&gt;ID == m){
fin = k;

free(l);
return fin;
}
}
}
}



この投稿にコメントする

削除パスワード

No.26429

Re:メモリの解放と削除の構文の何が駄目なのかわからない
投稿者---Aです(2006/03/16 14:26:12)


皆様の助言を下に頑張りましたところ何とかできました
いろいろ迷惑かけてすみません
丸投げしたような形もありましたがすみませんでした。
また困った時に来るのでよろしくお願いします


この投稿にコメントする

削除パスワード

No.26534

Re:メモリの解放と削除の構文の何が駄目なのかわからない
投稿者---shu(2006/03/29 18:59:52)


>どこがいけないのか教えてください

問題を載せないで、ソースを載せていることが間違っています。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧