簡體   English   中英

從塊外部訪問塊內的自動變量的內存?

[英]Access the memory of a auto variable inside a block from outside the block?

在我看來,塊中的auto變量在跳轉到外部范圍后會被釋放。 然后我寫了一個程序來測試這個,令我驚訝的是,它運行正常。 它甚至跑了好幾次。

該計划是:

#include <stdio.h>

int main(int argc, char **argv)
{
    int *a = 0;

    {   
        int b = 2;
        a = &b; 
    }   

    printf("%d\n", *a);
    return 0;
}

打印結果是2,這是怎么發生的?

根據ANSI標准,塊的自動變量“b”外側的任何引用都是無效的。 它取決於編譯器,它們如何在堆棧幀上推送和彈出局部變量。 可能你的編譯器在從最外面的塊退出時彈出所有本地。

即使它不在堆棧上,您也可以讀取地址。 如果堆棧進一步增長,則該地址可能會被其他變量修改。 在這種情況下,您將無法再次讀取相同的數據。

這完全取決於編譯器如何實現它? 根據標准,您不能使用任何本地數據類型在其延遲的范圍內。

自動變量的范圍可以分為以下幾類:

  1. 全球范圍
  2. 功能范圍
  3. 阻止范圍

根據聲明的位置,它可以具有不同的“可見性”。

在您的代碼中,變量“b”僅在其范圍內可見。 它可以分配內存,並可以在該范圍內使用。 在外面時,該內存不再與變量“b”相關聯。

但是,這並不意味着它被釋放。 如果聲明另一個變量或塊,它可能使用相同的內存位置。

您可以添加一些打印件並檢查正在引用的內存。 這會讓你更好地理解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM