指向局部变量

时间:2016-10-24 20:01:06

标签: c pointers

我想帮助理解这段代码:

void F (int a, int *b)
{
    a = 7 ;
    *b = a ;
    *b = 4 ;
    printf("%d, %d\n", a, *b);
    b = &a ;
}


int main()
{
    int m = 3, n = 5;
    F(m, &n) ;
    printf("%d, %d\n", m, n) ;
    return 0;
}

我很困惑,为什么这不会导致意外行为。在函数F的末尾,b的值是7.但是当我返回时,很明显在'之后没有任何内容。 b =& a'影响n / b的价值。 我认为指向一个局部变量会在范围发生变化时导致垃圾/意外行为,但事实并非如此。

2 个答案:

答案 0 :(得分:2)

当你调用F时,你传递m的值和n的地址。 在F中,b是指向n的指针,因此当您更改* b的值时,n的值会更改。但是,在“b =& a;”中你正在改变b点。在该行之后,b不再指向n。相反,它指向一个。该行对main()中的变量n没有任何作用。在此之后,如果更改* b的值,则将更改* b及其别名a的值。它不会改变main中n的值。

答案 1 :(得分:0)

  

在函数F的末尾,b的值为7

b的值不是7; b设置为指向a,其值为7

  

但是当我返回时,显然b = &a之后没有任何内容影响n的价值

虽然b是指针,但它是按值传递的。 b内的F表现得好像它是一个独立的,完全独立的局部变量。在F内对其进行的任何修改都属于F

实际上,您无法通过main内的操作在F中触发未定义的行为,因为main没有从F接收任何指针。如果要进行未定义的行为,请将指针指向F,并将其指定为指向局部变量:

void CauseUB(int a, int **b) {
    *b = &a;
}
int main() {
    int x = 5, *y = &x;
    printf("This is OK: %d\n", *y);
    CauseUB(x, &y); // Pointer to pointer
    printf("This is UB: %d\n", *y);
    return 0;
}

Demo.