0

私はこのコードを書いています:

        Resident_x * infos_shorted;
        Residents=6;
        infos_shorted=(Resident_x *)malloc(Residents*(sizeof(Resident_x)));
        i=0;
        while ((infos_shorted+i)!=NULL){
              printf ("%d\n", i);
              i++;
           }

誰かが私が6つのメモリ場所を割り当てたと予想するかもしれませんが、実行すると、手動で終了するまで i が出力され続けます。

それが、これである私の主な問題に対する答えを見つけるために私がしたことです:

私は書きます :

    Resident_x * infos_shorted;
    Residents=6;
    infos_shorted[i].height[8]=7;
    infos_shorted=(Resident_x *)malloc(Residents*(sizeof(Resident_x)));
    for (i=0; i<=Residents+4; i++){
          printf ("%d %d\n", infos_shorted[i].height, i);
    }

そして、 infos_shorted[i].height[8] が正しく印刷されます。それはどうですか。

4

2 に答える 2

1
while ((infos_shorted+i)!=NULL){

とすぐにi > Residents、未定義の動作が発生します。それにもかかわらず、の値の後ろのinfos_shorted + iアドレスi*sizeof(Resident_x)バイトに評価される可能性が非常に高いですinfos_shorted。そのようなアドレスがヌル ポインターであると期待する理由はありません (ラップするまでは、しかしそれはさらに未定義の動作です)。

于 2013-04-22T19:40:12.983 に答える
0

C ランタイムが希望どおりに動作することを期待しています。残念ながら、そのようには動作しません。malloc はメモリのチャンクを割り当てます。その開始と終了がどこにあるかを知るのはあなた次第です

あなたがしなければならない

  const int NRES = 6;
  Resident_x * infos_shorted;
    Residents=NRES;
    infos_shorted=(Resident_x *)malloc(Residents*(sizeof(Resident_x)));
    i=0;
    for(int i = 0; i < NRES; i++){
       ...info_shorted[i];
       }
于 2013-04-22T20:48:00.890 に答える