1. C語言「局部變數作用域」的問題
應該是沒有問題的。先輸出add函數中的num值4,再輸出main函數中的num值3。main函數中的num值沒有發生變化。實參傳遞給形參,形參改變了不會影響實參。
具體分析過程如下圖:
2. 在C語言中為什麼說絕不能返回函數內局部變數的地址
在程序中,只在特定的過程或函數中可以訪問的變數,是相對與全局變數而言的。
全局變數也稱為外部變數,是在函數的外部定義的,它的作用域為從變數定義處開始,到本程序文件的末尾。全局變數全部存放在靜態存儲區,在程序開始執行時給全局變數分配存儲區,程序行完畢就釋放。
局部變數可以和全局變數重名,但是局部變數會屏蔽全局變數。在函數內引用這個變數時,會用到同名的局部變數,而不會用到全局變數。
上面是摘抄
局部變數的特點是:隨函數調用時創建 隨函數結束時析構(銷毀)
設想 如果返回了一個局部變數的指針
而恰好 局部變數偏偏又在函數結束後銷毀
但指針並沒有被銷毀 而是被返回
那也就是說 指針指向的 正是一個被銷毀了的對象
3. 如果在函數中申明一個局部變數,然後返回它的地址,調用者獲取該地址值時,該地址是否有效為什麼
在你第一個例子里,你試試再輸出一次*p,也就是做兩次printf
printf("%d\n",*p);
printf("%d\n",*p); //看看這個還會不會正常
你的第二個例子已經說明問題了,p指向的地方已經不可靠了
第三個例子和第一個一樣,p指向的地方湊巧沒被修改
一個函數結束後,該函數內所有的自動變數所佔用的內存空間都被釋放,釋放的含義是:通知系統,這些內存已經是自由的了,可以被其他代碼改寫了。沒有被改寫前,這些內存中還是原來的值,至於什麼時候改寫,那誰也不知道。所以返回它們的地址是沒有任何意義的。
記住:」不要返回一個局部非靜態變數的地址「,這是C/C++的金科玉律。
4. C語言中的 局部變數,存儲在什麼地方
C語言中的局部變數存儲在棧里。
普通的局部變數在棧空間上分配,這個局部變數所在的函數被多次調用時,每次調用這個局部變數在棧上的位置都不一定相同。局部變數也可以在堆上動態分配(malloc),但是記得使用完這個堆空間後要釋放之。
在棧空間上分配時是要注意內存的,不能分配內存過大。如果棧內空間小於所申請的空間大小,那麼這時系統將揭示棧溢出,並給出相應的異常信息。但是堆不一樣,堆可分配空間是很大的。
(4)非0索引處訪問局部變數地址擴展閱讀
局部變數分類
1、位置:靜態局部變數被編譯器放在全局存儲區.data,所以它雖然是局部的,但是在程序的整個生命周期中存在(定義時出生,隨著程序結束而結束)。
2、訪問許可權:靜態局部變數只能被其作用域內的變數或函數訪問。也就是說雖然它會在程序的整個生命周期中存在,由於它是static的,它不能被其他的函數和源文件訪問。
3、值:靜態局部變數如果沒有被用戶初始化,則會被編譯器自動賦值為0,以後每次調用靜態局部變數的時候都用上次調用後的值。
5. ARM CPU如何在寄存器不足的情況下訪問局部變數
局部變數說白了就是在棧空間中的內存,就是說在沒有寄存器的時候怎麼訪問內存,這個問題編譯器基本不會讓它發生。如果是自己寫的匯編,那就是程序員該注意的了。在沒有寄存器的時候就要先保存寄存器。
ARM指令跟X86指令差別還是非常大的,我這里找了2條指令:
寄存器間接定址:
LDR R1,[R2] ;將R2作為地址,讀數據到R1中
基址定址:
LDR R2,[R3,#0x0F] ;將R3加0x0f作為地址,讀數據到R2中
ARM就是這么訪問內存的,包括外設寄存器也是這樣訪問的。它們是統一編址的。不像X86分開編址,用不同的指令訪問內存和外設。
6. C語言中什麼地址局部變數和全局變數的概念要具體概念
沒有理解你的第一個問題。
簡單地說,局部變數是在函數體定義的變數。全局變數是在所有函數外定義的變數。
局部變數和全局變數有下面的區別。
1)局部變數只能在被定義的函數體中引用;全局變數在程序的任何地方都可以引用
2)局部變數佔用棧內存,全局變數佔用固定的一段地址空間。
3)局部變數在運行時進入函數體時分配,全局變數在程序載入是分配並初始化。
4)局部變數在退出函數時自動消失,全局變數自始至終存在
7. 求教各位大神,調試c++程序出現局部變數無法初始化,部分全局變數出現內存無法訪問是怎麼回事
如果你的截圖顯示表明,單步執行賦值局部變數失敗,那麼,實際的問題出在進入這個函數之前。
出現這種問題,說明之前已經出現了非法地址訪問或溢出,你要通過調試分析,進入這個函數之前的代碼,是否有地址越界、指針溢出、資源耗盡等方面的問題。
而注銷這個函數調用就不出錯,只能說,恰好溢出問題出現在這一段代碼佔用的內存地址,導致進入這段代碼就報錯了,而不是問題出在賦值語句。
8. C語言中 局部變數和全局變數都是存儲在什麼區
C語言中局部變數存在棧里,全局變數存靜態存儲區。
局部變數在棧空間上分配,這個局部變數所在的函數被多次調用時,每次調用這個局部變數在棧上的位置都不一定相同。局部變數也可以在堆上動態分配,但是記得使用完這個堆空間後要釋放之。
全局變數全部存放在靜態存儲區,在程序開始執行時給全局變數分配存儲區,程序行完畢就釋放。在程序執行過程中它們占據固定的存儲單元,而不動態地進行分配和釋放;
(8)非0索引處訪問局部變數地址擴展閱讀
C語言中局部變數和全局變數示例:
#include<stdio.h>
#include<malloc.h>
staticints1=0,s2=0,s3=0;//靜態變數放在靜態區
intg1=0,g2=0,g3=0;//全局變數放在靜態區
voidmain()
{
staticints4=0,s5=0,s6=0;<spanstyle="font-family:Arial,Helvetica,simsun,u5b8bu4f53;"></span>//靜態變數
inta1=0,a2=0,a3=0;<spanstyle="font-family:Arial,Helvetica,simsun,u5b8bu4f53;"></span>//局部變數放在棧區
charc1[]="aabb";//局部變數放在棧區
char*c2="aabb";//字元常量放在靜態區
char*m1=(char*)malloc(1);//堆區
char*m2=(char*)malloc(1);//堆區
char*m3=(char*)malloc(1);//堆區
printf("動態數據區 ");
printf("a1 a2 a3 ",&a1,&a2,&a3);
printf("c1 ",c1);
printf("m1 m2 m3 ",&m1,&m2,&m3);
printf("靜態數據區 ");
printf("s1 s2 s3 ",&s1,&s2,&s3);
printf("g1 g2 g3 ",&g1,&g2,&g3);
printf("s4 s5 s6 ",&s4,&s5,&s6);
printf("c2 ",c2);
}
9. 返回局部變數的地址
局部變數的地址,在函數返回後,就被系統收回作為它用,第一次執行 cout<<*i<<endl;的時候,輸出4,表明這個地址在前面賦值4後還沒有被覆蓋過。第二次執行 cout<<*i<<endl; 的時候,輸出 -1209786380 表明在兩次調用cout之間,這個地址已經被其他內容所覆蓋了。