C 語言 區域性變數引用

2022-05-20 15:27:22 字數 708 閱讀 2656

所謂靜態記憶體分配,就是值我們並沒有鮮明的指明記憶體分配,普通的變數的宣告啦什麼的,都需要記憶體,但是都是由系統自動分配的,所以叫靜態記憶體分配。

關鍵點: 函式內部的區域性變數,在函式執行完銷毀,之前指向它的指標變得不確定

例如一段程式:

void swipe(int** p)

執行結果:

*p的:999

*p的:0

*p的:0

可以看出,我們的值已經交換成功了,但是為什麼繼續列印的時候就變成了0?

那是因為這個時候 temp 這個變數的記憶體位址被**了。所以指標main方法中的指標變數p所儲存的記憶體位址中的值,已經不是當初賦值的999了,已經不知道被誰徵用了。

這就是所謂的靜態記憶體分配,也就是記憶體的分配與**都是由系統自動操作的。而在方法裡面定義的變數,生命週期只在方法裡面,所以temp變數的值只在swipe方法裡面生效。方法執行完就該**了。那麼為什麼我們會在方法執行完,第一條列印語句的時候,值還存在,不是被**了嗎?這個可以叫做記憶體殘影吧,也就是說方法執行完裡面的變數記憶體會被**,但也是需要時間的,所以,第一條語句列印出來,只是剛好趕上了這個值沒有被**而已,不行,我們讓程式延遲一下,看看第一條語句還能列印出來嗎?

void swipe(int** p)

我們讓程式延遲個10毫秒看結果:

*p的:0

*p的:0

*p的:0

可以看出來,記憶體中的值已經被**了。

C語言 返回區域性變數

一般的來說,函式是可以返回區域性變數的。區域性變數的作用域只在函式內部,在函式返回後,區域性變數的記憶體已經釋放了。因此,如果函式返回的是區域性變數的值,不涉及位址,程式不會出錯。但是如果返回的是區域性變數的位址 指標 的話,程式執行後會出錯。因為函式只是把指標複製後返回了,但是指標指向的內容已經被...

c語言臆想 全域性 區域性變數

data段在編譯時就已確定大小,在程式一執行就分配空間 棧中的資料在執行時才分配空間。首先型別 靜態變數 都不再棧中管理,編譯時在靜態儲存區分配空間。非靜態變數 除全域性變數外,都在棧中管理,執行時分配記憶體。作用域 全域性變數 都不再棧中管理,編譯時在靜態儲存區分配空間。在程式執行結束前都有效。區...

C語言坑之區域性變數

函式的動態 auto 變數是在棧儲存的。棧儲存的變數會在函式結束之後釋放掉。靜態變數 static 是在資料區儲存,程序結束之後,才會釋放。一.動態變數 main函式通過呼叫test函式,test函式接收了fun函式區域性變數a的儲存位址,但在接收之前,fun函式已經執行結束了,即區域性變數a已經被...