1. 程式人生 > >C/C++ 變數的作用域 與區域性變數

C/C++ 變數的作用域 與區域性變數

區域性變數例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;

}

以上是個人對區域性變數的理解請多多指教