2016-05-17 8 views
0

このプログラムを作成して、ビーセットとして駐車場を表現しました。駐車場の各スペースは1ビットです。私はスペースが占有されているかどうかをチェックするcheckSpace関数を持っています。何らかの理由で私の駐車場のビットセットへのポインタが変更されたり、関数に渡された後にデータが変更されたりします。それをテストするために、私は駐車場を設置し、スペースをチェックした後、直ちにそれをチェックし、何らかの理由で戻り値が変わってはならないときに変更しています。どんな助けもありがとう!関数呼び出し後にポインタが変化しています。C

struct carPark{ 
     int spaces, levels; 
     unsigned char * park; 
    }; 

    struct carPark * emptyCarPark(int levels, int spaces){ 
     int chars = (spaces*levels)/8; 
     if((spaces*levels)%8 != 0){ 
      chars++; 
     } 
     unsigned char park[chars]; 
     for (int i = 0; i < chars; ++i){ 
      park[i] = 0; 
     } 
     unsigned char * ptr = &park[0]; 
     struct carPark * myPark = malloc(sizeof(struct carPark)); 
     myPark->park = ptr; 
     myPark->spaces = spaces; 
     myPark->levels = levels; 
     return myPark; 
    } 

    int checkSpace(int level, int spaceNum, struct carPark * carpark){ 
     int charPosition = ((level*carpark->spaces) + spaceNum)/8; 
     int bitPosition = ((level*carpark->spaces) + spaceNum)%8; 
     if(carpark->park[charPosition]&&(1<<bitPosition) != 0){ 
      return 1; 
     } 
     return 0; 
    } 

    int main(int argc, char const *argv[]){ 
     struct carPark * myPark = emptyCarPark(5,20); 
     printf("1st check: %d\n",checkSpace(1,1,myPark)); 
     printf("Second check: %d\n",checkSpace(1,1,myPark)); 
     return 0; 
    } 

だから私は私が手にプログラムを実行すると、以下のコードで

1st check: 0 
    Second check: 1 
+0

期待値は何ですか? 0 2回目のチェック:0 – HoKy22

+0

これは、それがすべきことです。もう1つの答えは、それをクリアしました。私はそれが正しいと思われる単なる値であると推測しています。 – JohnM

答えて

1

ルック - emptyCarPark(中)を使用すると、スタック上の公園の配列を割り当て、それへのポインタを返すされています。すぐに関数が戻るよう、公園アレイはもはや割り当てられていないと、あなたはダングリングポインタ持っている - を参照して、より多くの情報のために:Cause of dangling pointers (Wikipedia)

unsigned char park[chars]; 
    for (int i = 0; i < chars; ++i){ 
     park[i] = 0; 
    } 
    // This is the pointer to an object on the stack. 
    unsigned char * ptr = &park[0]; 

    struct carPark * myPark = malloc(sizeof(struct carPark)); 
    myPark->park = ptr; 
+0

ありがとう返信、私は今それを得ると思うので、正しい方法は、パークではなく、配列のポインタを作ることですか? "unsigned char * park = malloc(chars);" – JohnM

+0

はい、私はそれが行く方法だと思います。また、私はあなたがptr変数を必要としないと思う - "&park [0]"は "park"と同じです。 私の回答があなたの問題を解決した場合は、答えとして大きなチェックボックスをクリックしてください。 – Loring

関連する問題