←検索窓の楽しみ方
  ショッピングモール  掲示板ランキング


【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板1こちら


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

No.3645

構造体ポインタ
投稿者---ウタ(2005/04/07 18:49:56)


構造体領域を動的に確保し、データを入力した後それを出力するプログラムです。(ソースは大幅略。)

func1(){
    struct result *res;
    
    res = (struct result  *)calloc(Cnt, sizeof(struct result));
            
    for(i = 0; i < Cnt; i++){
        ...   /* 構造体にデータ格納 */
       res++;
    }

    for(i = 0; i < Cnt; i++){
        printf("%s\n", res[i].string);  /* 構造体に格納されたデータ表示 */
    }

    free(res);

}


上記func1()のデータ表示のところで落ちてしまいました。不正なアドレスを参照かと思い、なんとなく
struct result *p;
p=res;
の2行を追加し、free(res); を free(p)に修正したところうまく動きました。
ちなみに、

func2(){
    struct infomation *info;
    
    info = (struct infomation *)calloc(Cnt, sizeof(struct infomation));
    
    func3(info);      /* infoにデータ格納する関数 */
    
    for(i = 0; i < Cnt; i++){
        printf("%s\n", info[i].string);
    }

    free(info);

}




上記func2()はこのままで正常に動きます。なぜこのようになるのですか?
また、修正方法はこれで問題ありませんか?
よろしくお願いします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:構造体ポインタ 3646 REE 2005/04/07 19:52:54


No.3646

Re:構造体ポインタ
投稿者---REE(2005/04/07 19:52:54)


>なぜこのようになるのですか?
callocの戻り値resを変更しているためです。
freeする時には、callocの戻り値と同じ値を指定する必要があります。

>また、修正方法はこれで問題ありませんか?
さらにres[i]をp[i]にする必要があります。



この投稿にコメントする

削除パスワード

No.3647

Re:構造体ポインタ
投稿者---ウタ(2005/04/07 22:16:38)


回答、ありがとうございます。

>freeする時には、callocの戻り値と同じ値を指定する必要があります。

確かに、データ表示部分を省略するとfree()で落ちました。
では、データ表示部分で落ちてしまうのはなぜですか?
func2()のデータ表示部分との違いがよく解らなくて。






この投稿にコメントする

削除パスワード

No.3648

Re:構造体ポインタ
投稿者---あかま(2005/04/07 22:33:08)


>では、データ表示部分で落ちてしまうのはなぜですか?
>func2()のデータ表示部分との違いがよく解らなくて。
コードがないのでなんとも言えませんがfunc3がうまく働いてないのでは?
stringの文字列の最後に'\0'が追加されてないとか、
stringのサイズ以上の文字列を書き込んでいるとか。


この投稿にコメントする

削除パスワード

No.3652

Re:構造体ポインタ
投稿者---ウタ(2005/04/08 09:11:36)


>>では、データ表示部分で落ちてしまうのはなぜですか?
>>func2()のデータ表示部分との違いがよく解らなくて。
>コードがないのでなんとも言えませんがfunc3がうまく働いてないのでは?
>stringの文字列の最後に'\0'が追加されてないとか、
>stringのサイズ以上の文字列を書き込んでいるとか。

すいません。コード省きすぎて反って解りにくくなっちゃいましたね。
一応、ここに載せた部分以外は正常に動いているものとしてください。


この投稿にコメントする

削除パスワード

No.3650

Re:構造体ポインタ
投稿者---Blue(2005/04/08 00:06:17)


>    for(i = 0; i < Cnt; i++){
>        printf("%s\n", res[i].string);  /* 構造体に格納されたデータ表示 */
>    }
この時点のres[ i ] はメモリ割り当てられていないアドレスを指しています。(アクセス違反になる)

func2の場合は表示時のinfo[i]はcallocしたアドレスですから正常に動作します。



この投稿にコメントする

削除パスワード

No.3651

Re:構造体ポインタ
投稿者---RAPT(2005/04/08 01:15:20)


> ...   /* 構造体にデータ格納 */
> res++;
をやめて、res[i]でアクセスするようにすれば良い。



この投稿にコメントする

削除パスワード

No.3653

Re:構造体ポインタ
投稿者---ウタ(2005/04/08 09:27:32)


>この時点のres[ i ] はメモリ割り当てられていないアドレスを指しています。(アクセス違反になる)

><pre>> ... /* 構造体にデータ格納 */
> res++;
をやめて、res[i]でアクセスするようにすれば良い。
</pre>

基本的なことが理解できてませんでしたね。res[i]と記述すれば、その時点で*resがどこの位置にあっても絶対的に「確保した領域の先頭からi番目」を参照してくれるんだと思ってました。
では、たとえば
char str[5];
があり、このstrに対するポインタ*pが現在str[2]を指していたとすると、
p[2]とはstr[4]を指すということですか?
書いてるうちに、当たり前だという気がしてきましたが。


この投稿にコメントする

削除パスワード

No.3654

Re:構造体ポインタ
投稿者---あかま(2005/04/08 11:12:44)


>では、たとえば
>char str[5];
>があり、このstrに対するポインタ*pが現在str[2]を指していたとすると、
>p[2]とはstr[4]を指すということですか?
>書いてるうちに、当たり前だという気がしてきましたが。
そうです。



この投稿にコメントする

削除パスワード

No.3655

Re:構造体ポインタ
投稿者---ウタ(2005/04/08 17:11:50)


納得できました。
みなさん、ありがとうございました。


この投稿にコメントする

削除パスワード

No.3656

Re:構造体ポインタ
投稿者---RAPT(2005/04/10 08:53:10)


捕捉。
p がポインタ、indexが添え字だとすると、一般に
*(p + index) == p[index]
となります。
# p[index] is the "syntax sugar" to *(p + index)



この投稿にコメントする

削除パスワード

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




掲示板提供:Real Integrity