【问题标题】:Pointer is changing after function call, C函数调用后指针正在改变,C
【发布时间】:2016-05-17 17:05:57
【问题描述】:

所以我编写了这个程序来将停车场表示为一个位集,停车场中的每个空间都是一个位。我有一个 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

【问题讨论】:

  • 期望值是多少?当我运行它时,我得到第一次检查:0 第二次检查:0
  • 应该是这样,其他答案现在已经清除了,我猜这只是看起来正确的垃圾值

标签: c pointers


【解决方案1】:

看看下面的代码 - 在 emptyCarPark() 中,您在堆栈上分配 park 数组,然后返回一个指向它的指针。函数返回后,不再分配 park 数组,并且您有一个悬空指针 - 更多信息,请参阅: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;

【讨论】:

  • 感谢您的回复,我想我现在明白了,那么正确的做法是让 park 成为指针而不是数组? "unsigned char * park = malloc(chars);"
  • 是的,我认为这是要走的路。另外,我认为您不需要 ptr 变量-“&park[0]”与“park”相同。如果我的回答解决了您的问题,请点击大复选框接受它作为答案。
猜你喜欢
  • 2016-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
  • 1970-01-01
  • 2015-08-31
  • 2020-01-14
相关资源
最近更新 更多