【问题标题】:Why not segmentation fault, at accessing blocked/restricted memory location?为什么在访问阻塞/受限的内存位置时不会出现分段错误?
【发布时间】:2014-07-18 23:47:37
【问题描述】:

关于我的问题下面的代码是因为“ptr”在本地块中。那么它如何在功能块之外访问。应该被限制 不是吗?就像一个正常的变量。我们正在尝试访问另一个函数的内存位置。

int * add(int a, int b){
    // local pointer variable
    int *ptr=NULL,c=0;
    c = a+b;
    ptr = &c;
    return ptr;
}

int main()
{
    // calling add function and accessing
    // the value received using reference(*).
    printf("%d",*add(2,3));
}

【问题讨论】:

    标签: c pointers memory memory-management scope


    【解决方案1】:

    变量是在堆栈上创建的。堆栈由系统以至少几千字节的粒度分配,并且没有释放,因此不会崩溃——内存仍然可以访问。

    因此,尽管您在那里做了一件禁止和不安全的事情,但它可能会意外工作,甚至显示正确的值,因为在此期间没有函数调用会覆盖堆栈和 c 的值。

    【讨论】:

      【解决方案2】:

      记住一条规则:永远不要返回指向局部变量的指针。

      一旦add返回,变量c就不存在了,所以指向它的指针就会失效。

      【讨论】:

        猜你喜欢
        • 2018-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-10
        • 2015-01-31
        • 1970-01-01
        • 2011-04-23
        相关资源
        最近更新 更多