C/C++中關於函式呼叫結束後變數釋放的問題
問題:
#include <stdio.h>
int* fa();
void main()
{
int *p=fa();
printf("%d\n",*p);
}
int* fa()
{
int i=97;
return &i;
}
我記得書上說過當函式呼叫結束後,函式中所定義的區域性變數會全部被釋放,也就是函數fa()中的變數i在呼叫結束後會被釋放,為什麼這裡還能引用輸出函式fa()中的區域性變數值呢?
解答:
其實這麼引用很危險,非常不推薦。
fa()執行完畢後,i被釋放,其實是指將編譯器中對於該地址的控制給釋放。
這塊地址是存在的,但是已經沒有受控的指標指向它。
&i目前也就成為我們所說的野地址。
當前這塊地址有可能已經被其他程式/系統其他程序所使用,
也有可能還沒有被使用。
所以當前*p指向的內容是不可預測的。
但是由於這個程式執行非常快,很大可能是&i這個地址內的值還是原先賦的值。
但是這麼訪問很危險,一旦這塊地址已經被系統或者其他應用程式使用,對於它的訪問,有可能導致異常。
相關推薦
C/C++中關於函式呼叫結束後變數釋放的問題
問題: #include <stdio.h>int* fa();void main(){int *p=fa();printf("%d\n",*p);}int* fa(){int i=97;return &i;}我記得書上說過當函式呼叫結束後,函式中所定義
C語言中函式呼叫怎麼返回兩個值
在C語言中,函式只能返回一個值,要返回兩個值,可以改換思路,通過其它方式做到。 1 建立陣列,返回指標。 在要返回的兩個值型別相同時,可以用建立陣列的方式,將要返回的值存在陣列中,並返回陣列首地址,這樣就可以實現返回兩個值的效果。 需要注意的是,要返回陣列首地址,那麼返回
c語言中函式呼叫的過程
一.程式在記憶體中的佔用。要學習C語言中函式呼叫的過程,必須要知道程式在記憶體中各個區域的分佈。C語言的函式呼叫的過程主要分佈在棧中,所以我們今天主要研究棧。二.幾個基本的彙編指令。 call:1.將當前指令的下一條指令的地址儲存到棧中。 2.
C語言中函式呼叫與返回值的關係是什麼
而函式是負責要做什麼 3); //呼叫函式 3我們稱為形式引數 int sum(int arg1 並傳遞引數3和4過去 函式將計算機過程封裝 也就可以說沒有返回值 ||| 函式呼叫和返回值的關係其實和賦值運
C語言中函式呼叫中的傳值與傳址
首先介紹一下函式中傳值與傳址的概念: 傳值:傳值,實際是把實參的值賦值給行參,相當於copy。那麼對行參的修改,不會影響實參的值 。 傳址: 實際是傳值的一種特殊方式,只是他傳遞的是地址,不是普通的賦值,那麼傳地址以後,實參和行參都指向同一個物件,因此對形參
函式內定義非靜態區域性變數當函式執行結束後自動釋放
#include <stdio.h> int main(void) { void fun(char **p); char arr[3] = {lis}; char *p1 = arr; fun(&p1)
C++中帶有預設引數的宣告和定義。Qt中重寫預設建構函式。C++中函式呼叫時實參個數和函式定義時的形參個數不一致時的處理。
1、Qt中自動生成的建構函式 (1)Qt中自動生成的建構函式的宣告 class Chat : public QWidget { Q_OBJECT public: explicit Chat(QWidget *parent = 0); //宣告建構函式,可以帶有初始值“=0”
託管C++中函式呼叫的雙重轉換(Double Thunking)
在VC.Net中使用預設設定/clr編譯時,一個託管函式會產生兩個入口點,一個是託管的,供託管程式碼呼叫,另外一個是非託管的,供非託管程式碼呼叫。但是函式地址,特別是虛擬函式指標只能有一個值,所以需要有一個預設的入口。非託管入口點可能是所有呼叫的預設入口(在 Visual
C語言中函式的呼叫與棧幀
int main() { 002233C0 push ebp 002233C1 mov ebp,esp 002233C3 sub esp,0E4h 002233C9 push
c指標在函式呼叫過程中的問題
</pre><p></p><pre name="code" class="cpp">#include <stdio.h> #include <stdlib.h> int *c; void f(int *
C++程式中如何呼叫C函式
C++語言支援函式過載,C 語言不支援函式過載。函式被C++編譯後在庫中的名字與C 語言的不同。假設某個C函式的宣告如下:void foo(int x, int y);該函式被C編譯器編譯後在庫中的名字為_foo,而C++編譯器則會產生像_foo_int_int之類的名字用
C語言中函式的思考(可以返回區域性變數嗎)
一般的來說,函式是可以返回區域性變數的。 區域性變數的作用域只在函式內部,在函式返回後,區域性變數的記憶體已經釋放了。因此,如果函式返回的是區域性變數的值,不涉及地址,程式不會出錯。但是如果返回的是區域性變數的地址(指標)的話,程式執行後會出錯。因為函式只是把指標複製後返
如何在c語言中原始檔呼叫另一個原始檔的函式
在原始檔A1.c中呼叫A2.c 中的函式 有兩種方法: 1.在A2.c中有完整的函式定義,在A1.c中新增一下要用到的函式原型(宣告)就可以了,例如: 在A2.c中:有函式void A2(){…}; 在A1.c中:在檔案前頭增加一行:void A2(
C語言中函式宣告、形參、實參
函式原型: 原型prototype是函式的宣告;描述了函式的返回值與引數; 函式原型說明了兩點: 1、該函式的返回值 2、該函式的引數及其型別 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 函式的引數: 引數到底是什
linux下的c語言系統函式呼叫
目錄 4.linux下的系統函式的使用 c語言 4.1數學函式的使用 1pow函式 2.exp函式 3.log函式 4.rand()隨機數函式 4.2字元函式的使用 4.3系統時間與日期函式的使用 系統時間 時間間隔 4.4環境控制函式 &nb
c語言中指令碼呼叫
c語言中如何呼叫指令碼 對於海思3518ev100只有一個物理介面,而這一個物理介面要實現對相機和sil9024進行初始化,再對相機進行初始化時是利用其複用功能i2c進行初始化的,而對9024初始化是利用gpio模擬i2c進行的,但是在進行相機初始化之後需要將i2c釋放,然後設定成gpi
C語言中函式指標陣列的初始化和使用
不比多說上一個程式碼,就懂了! 程式碼一: #include <stdio.h> int func(int i) { printf("%d\n",i); return i*i; } int
深入理解C語言的函式呼叫過程
本文主要從程序棧空間的層面複習一下C語言中函式呼叫的具體過程,以加深對一些基礎知識的理解。 先看一個最簡單的程式: 點選(此處)摺疊或開啟 /*test.c*/ #include <stdio.h> int foo1(
C語言彙編-函式呼叫堆疊的過程
本篇來分析函式呼叫的過程:通過下面一個簡單的例子來進入話題:#include<stdio.h>int sum(int a,int b){ int tmp=0; tmp=a+b; return tmp;}int main(){ int a=10; int b=20;
C語言彙編-函式呼叫棧
函式呼叫大家都不陌生,呼叫者向被呼叫者傳遞一些引數,然後執行被呼叫者的程式碼,最後被呼叫者向呼叫者返回結果,還有大家比較熟悉的一句話,就是函式呼叫是在棧上發生的,那麼在計算機內部到底是如何實現的呢? 對於程式,編譯器會對其分配一段記憶體,在邏輯上可以分為程式碼段,資料段,堆,棧 程式碼段:儲存程式文字,指令