簡體   English   中英

調用函數C后指針發生變化

[英]Pointer is changing after function call, C

因此,我編寫了此程序,以一個停車位來表示一個停車場,停車場中的每個空間都是一個位。 我有一個checkSpace函數來檢查是否已占用空間,並且由於某種原因,指向停車場位集的指針發生更改,或者在將其傳遞給函數后,數據發生了變化。 為了測試它,我設置了停車場,檢查了一個空間,然后在由於某種原因返回值在不應該更改的情況下立即更改,然后再次對其進行了檢查。 任何幫助,將不勝感激!

    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

看下面的代碼-在emptyCarPark()中,您正在堆棧上分配park數組,然后返回指向它的指針。 函數返回后,就不再分配park數組,並且您有一個懸空指針-有關更多信息,請參見: 懸空指針的原因(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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM