3
#include <stdio.h>
int main(int argc, char * argv[])
{
    int *ip;
    printf("%d\n", *ip);
    ip=NULL;

        if (1)
        {
            int i=300;
            printf("Inside If Block \n");
            ip=&i;
            printf("*ip=%d----------\n", *ip);
        }
    //printf("i=%d\n", i); /* Now this will cause an error, i has Block scope, fair enough */
    printf("*ip=%d\n", *ip);    
    return 0;
}      

最后一个如何printf()返回正确的值i
是因为即使i超出范围,内存位置仍然保留该值?它是如何工作的 ?

4

2 回答 2

2

局部变量i超出范围,因此无法访问,但碰巧它在堆栈上的内存位置(存储在 中ip)未被覆盖。你绝对不能依赖这种行为,但在实践中你会发现它在许多平台上都是正确的。

于 2012-11-26T16:12:43.757 回答
0

这是因为ip它保留了它的值,即使它指向的变量不存在。

你应该非常小心地这样做,因为在像这样的星座中

#include <stdio.h>
int main(int argc, char * argv[])
{
    int *ip;
    printf("%d\n", *ip);
    ip=NULL;

        if (1)
        {
            int i=300;
            printf("Inside If Block \n");
            ip=&i;
            printf("*ip=%d----------\n", *ip);
        }

    {
        float j=400.0;
    }

    //printf("i=%d\n", i); /* Now this will cause an error, i has Block scope, fair enough */
    printf("*ip=%d\n", *ip);    
    return 0;
}

变量i,并且j可能共享它们的位置,因为它们从不共存。如果ip指向那里,j' 值可能会损坏。

于 2012-11-26T16:14:36.610 回答