C/C++ 變數的作用域 與區域性變數
阿新 • • 發佈:2019-01-22
區域性變數例1
#include <stdio.h>
#include <stdlib.h>
//區域性變數例題1
void changeNum1()//定義函式
{
//區域性變數
//定義變數 並賦初值
int num1 = 5,num2 = 8;
//修改變數值
num1 = 55;
num2 = 288;}
int main()
{
//定義變數 並賦初值
int num1 = 5, num2 = 8;
num1 = 55;
//呼叫函式
changeNum1();
printf("num1 = %d\nnum2 = %d\n",num1,num2);
printf("觀察結果在main函式中num1的值被修改,mum2的值未被修改\n");printf("所以只修改區域性變數是沒有用的\n");
return 0;
}
區域性變數與陣列指標
#include <stdio.h>
#include <stdlib.h>//區域性變數例題2
int * change_Num2()
{
//區域性變數
int nums[]={1,2,3,4,5,};//定義函式
return nums;}
int main()
{
//定義一個數組來接收*changeNum2()的返回值
int *nums = change_Num2();//呼叫函式
int i;
for(i=0;i<5;i++)
{
//用指標形式迴圈列印陣列元素
printf("%d\n",*(nums + i));
}
//注意這裡連返回值的不可訪問,所以不可使用區域性變數返回陣列
//解決方法就是使用全域性變數而不
//這裡會出現一個程式接收信SIGSEGV 線性分割錯誤
//Program received signal SIGSEGV Segmentation fault
//或者亂碼
/**補充內容
*SIGSEGV 是segmentationviolation 性質符:號常 計算機術語
*SIGSEGV分為SIG+SEGV。SIG是訊號名的通用字首;
*SEGV是segmentation violation(段違例)的縮寫
*使用方法
*對於不正確的記憶體處理(見段錯誤),計算機程式可能丟擲SIGSEGV。
*作業系統可能使用訊號棧向一個處於自然狀態的應用程式通告錯誤,由此,
*開發者可以使用它來除錯程式或處理錯誤。
*在一個程式接收到SIGSEGV時的預設動作是異常終止。這個動作也許會結束程序,
*但是可能生成一個核心檔案以幫助除錯,或者執行一些其他特定於某些平臺的動作。
*例如,使用了grsecurity補丁的Linux系統可能記錄SIGSEGV訊號
*以監視可能的使用快取溢位的攻擊嘗試。
*SIGSEGV可以被捕獲。也就是說,應用程式可以請求它們想要的動作,以替代預設發生的動作。
*這樣的動作可以是忽略它、呼叫一個函式,或恢復預設的動作。在一些情形下,
*忽略SIGSEGV導致未定義行為。
*一個應用程式可能處理SIGSEGV的例子是偵錯程式,它可能檢查訊號棧並通知開發者目前所發生的
*以及程式終止的位置。
*SIGSEGV通常由作業系統生成,但是有適當許可權的使用者可以在需要時使用kill系統呼叫或kill命令
*(一個使用者級程式,或者一個shell內建命令)來向一個程序傳送訊號。
*/
return 0;}
以上是個人對區域性變數的理解請多多指教