我的程序有一个有趣的行为。最好先显示代码。

typedef struct PS {
    int num;
} PR;

typedef struct PS* PN;

typedef struct {
    int num;
    int tmp;
} VD;

void F (PN VPtr)
{
    register VD* qVPtr = (VD*)VPtr;
    // if this is call #2
    // qVPtr->tmp already is 8 for VP arg
    // qVPtr->tmp already is 16 for VP1 arg

    switch(VPtr->num){
    case 0:
        qVPtr->tmp = 8;
    return;
    case 1:
        qVPtr->tmp = 16;
        return;
    }
}

int main()
{
    PN VP = NULL;
    VP = (PN)malloc(sizeof(PR));

    VP->num = 0;
    F (VP);

    PN VP1 = NULL;
    VP1 = (PN)malloc(sizeof(PR));

    VP1->num = 1;
    F (VP1);

    F (VP);     // call #2 with VP arg
    F (VP1);    // call #2 with VP1 arg

    return 0;
}

在主函数VPVP1中不知道qVPtrtmp字段,但根据VPtr函数中的F参数,可以获得qVPtr->tmp的最后值。
你能详细解释一下这种可能性吗?

最佳答案

F行为没有什么奇怪的——如果你让它考虑指针
VPtr作为指向VD struct的指针,它将内存视为包含VD struct object的内存,尽管没有任何VD对象。出现“magic”是因为结构PR和VD都以相同大小的整数字段开头。
但内存的下一部分是未分配的,这意味着系统可以用它做任何它想做的事情,当你在那里写的时候,你可以开枪打你的腿。

关于c++ - 使用结构类型转换的有趣行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13624423/

10-10 21:06