我想帮助理解这段代码:
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的价值。 我认为指向一个局部变量会在范围发生变化时导致垃圾/意外行为,但事实并非如此。
答案 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;
}