亚欧色一区w666天堂,色情一区二区三区免费看,少妇特黄A片一区二区三区,亚洲人成网站999久久久综合,国产av熟女一区二区三区

  • 發布文章
  • 消息中心
點贊
收藏
評論
分享
原創

C語言各種變量與const

2023-03-28 00:55:53
22
0

使用C語言開發中,常使用的變量有全局變量、局部變量、靜態全局變量、靜態局部變量這幾種, 可以從兩個方面來區分他們

1、作用域

  • 全局變量具有全局作用域。全局變量只需在一個源文件中定義,就可以作用于所有的源文件。當然,其他不包含全局變量定義的源文件需要用extern 關鍵字再次聲明這個全局變量。
  • 局部變量也只有局部作用域,它是自動對象(auto),它在程序運行期間不是一直存在,而是只在函數執行期間存在,函數的一次調用執行結束后,變量被撤銷,其所占用的內存也被收回。
  • 靜態全局變量也具有全局作用域,它與全局變量的區別在于如果程序包含多個文件的話,它作用于定義它的文件里,不能作用到其它文件里,即被static關鍵字修飾過的變量具有文件作用域。這樣即使兩個不同的源文件都定義了相同名字的靜態全局變量,它們也是不同的變量。
  • 靜態局部變量具有局部作用域,它只被初始化一次,自從第一次被初始化直到程序運行結束都一直存在,它和靜態全局變量的區別在于全局變量對所有的函數都是可見的,而靜態局部變量只對定義自己的函數體始終可見。

2、內存分配和存儲

  • 全局變量,靜態局部變量,靜態全局變量都在靜態存儲區分配空間,而局部變量在棧里分配空間。
  • 全局變量本身就是靜態存儲方式, 靜態全局變量當然也是靜態存儲方式。這兩者在存儲方式上并無不同。這兩者的區別雖在于非靜態全局變量的作用域是整個源程序,當一個源程序由多個源文件組成時,非靜態的全局變量在各個源文件中都是有效的。而靜態全局變量則限制了其作用域,即只在定義該變量的源文件內有效,在同一源程序的其它源文件中不能使用它。由于靜態全局變量的作用域局限于一個源文件內,只能為該源文件內的函數公用,因此可以避免在其它源文件中引起錯誤;
  • 靜態變量會被放在程序的靜態數據存儲區(全局可見)中,這樣可以在下一次調用的時候還可以保持原來的賦值
  • 靜態局部變量用static告知編譯器,自己僅僅在變量的作用范圍內可見。這一點是它與全局變量的區別。

 

3. 進階:const變量

如下程序比較簡單, 很容易得出輸出是

/* CONNTRACL */
static const char magicstart[] = {0x43, 0x4f, 0x4e, 0x4e, 0x54, 0x52, 0x41, 0x43, 0x4C};
static const int magiclen = 9;
/* CEND */
static const char magicend[] = {0x43, 0x45, 0x4e, 0x44};

static void help(void)
{
    fprintf(stderr, 
       "\tmagicstart[%s]\n"
        "\tmagicend[%s]\n", magicstart, magicend);
    exit(0);
}

int main(int argc, const char **argv)
{
    help();
    return 0;
}

很容易得出輸出是

    magicstart[CONNTRACL]
    magicend[CEND]
 
簡單需改一下程序如下
/* CONNTRACL */
static const char magicstart[] = {0x43, 0x4f, 0x4e, 0x4e, 0x54, 0x52, 0x41, 0x43, 0x4C};
static int magiclen = 9;
/* CEND */
static const char magicend[] = {0x43, 0x45, 0x4e, 0x44};

static void help(void)
{
    fprintf(stderr, 
       "\tmagicstart[%s]\n"
        "\tmagicend[%s]\n", magicstart, magicend);
    exit(0);
}

int main(int argc, const char **argv)
{
    help();
    return 0;
}
 

結果并沒有按上面的結果輸出, 輸出的是:

        magicstart[CONNTRACLCEND]
        magicend[CEND]

代碼里唯一的差別就是唯一的差別就是變量magiclen, 前面程序中它是const類型的靜態全局變量,后者是非const靜態全局變量,

const類型的靜態全局變量會存儲在在只讀數據段, 非const靜態全局變量存儲在靜態存儲區

后面程序中magicstart沒有數組結束符'\n', 中間如果沒存儲其他類型的數據,在輸出字符數組指針magicstart的內容的時候,會輸出后面連續的字符、

程序中的變量存儲情況可以通過nm進行查看, 可以看到后面的程序magiclen類型是d, 表示全局變量, 類型r表示只讀存儲區

[root@test]$ nm -n -C test1 |grep magic  
0000000000400680 r magicstart
000000000040068c r magiclen
0000000000400690 r magicend
[root@test]$ nm -n -C test2 |grep magic 
0000000000400680 r magicstart
0000000000400689 r magicend
0000000000601034 d magiclen
0條評論
作者已關閉評論
何****森
15文章數
1粉絲數
何****森
15 文章 | 1 粉絲
何****森
15文章數
1粉絲數
何****森
15 文章 | 1 粉絲
原創

C語言各種變量與const

2023-03-28 00:55:53
22
0

使用C語言開發中,常使用的變量有全局變量、局部變量、靜態全局變量、靜態局部變量這幾種, 可以從兩個方面來區分他們

1、作用域

  • 全局變量具有全局作用域。全局變量只需在一個源文件中定義,就可以作用于所有的源文件。當然,其他不包含全局變量定義的源文件需要用extern 關鍵字再次聲明這個全局變量。
  • 局部變量也只有局部作用域,它是自動對象(auto),它在程序運行期間不是一直存在,而是只在函數執行期間存在,函數的一次調用執行結束后,變量被撤銷,其所占用的內存也被收回。
  • 靜態全局變量也具有全局作用域,它與全局變量的區別在于如果程序包含多個文件的話,它作用于定義它的文件里,不能作用到其它文件里,即被static關鍵字修飾過的變量具有文件作用域。這樣即使兩個不同的源文件都定義了相同名字的靜態全局變量,它們也是不同的變量。
  • 靜態局部變量具有局部作用域,它只被初始化一次,自從第一次被初始化直到程序運行結束都一直存在,它和靜態全局變量的區別在于全局變量對所有的函數都是可見的,而靜態局部變量只對定義自己的函數體始終可見。

2、內存分配和存儲

  • 全局變量,靜態局部變量,靜態全局變量都在靜態存儲區分配空間,而局部變量在棧里分配空間。
  • 全局變量本身就是靜態存儲方式, 靜態全局變量當然也是靜態存儲方式。這兩者在存儲方式上并無不同。這兩者的區別雖在于非靜態全局變量的作用域是整個源程序,當一個源程序由多個源文件組成時,非靜態的全局變量在各個源文件中都是有效的。而靜態全局變量則限制了其作用域,即只在定義該變量的源文件內有效,在同一源程序的其它源文件中不能使用它。由于靜態全局變量的作用域局限于一個源文件內,只能為該源文件內的函數公用,因此可以避免在其它源文件中引起錯誤;
  • 靜態變量會被放在程序的靜態數據存儲區(全局可見)中,這樣可以在下一次調用的時候還可以保持原來的賦值
  • 靜態局部變量用static告知編譯器,自己僅僅在變量的作用范圍內可見。這一點是它與全局變量的區別。

 

3. 進階:const變量

如下程序比較簡單, 很容易得出輸出是

/* CONNTRACL */
static const char magicstart[] = {0x43, 0x4f, 0x4e, 0x4e, 0x54, 0x52, 0x41, 0x43, 0x4C};
static const int magiclen = 9;
/* CEND */
static const char magicend[] = {0x43, 0x45, 0x4e, 0x44};

static void help(void)
{
    fprintf(stderr, 
       "\tmagicstart[%s]\n"
        "\tmagicend[%s]\n", magicstart, magicend);
    exit(0);
}

int main(int argc, const char **argv)
{
    help();
    return 0;
}

很容易得出輸出是

    magicstart[CONNTRACL]
    magicend[CEND]
 
簡單需改一下程序如下
/* CONNTRACL */
static const char magicstart[] = {0x43, 0x4f, 0x4e, 0x4e, 0x54, 0x52, 0x41, 0x43, 0x4C};
static int magiclen = 9;
/* CEND */
static const char magicend[] = {0x43, 0x45, 0x4e, 0x44};

static void help(void)
{
    fprintf(stderr, 
       "\tmagicstart[%s]\n"
        "\tmagicend[%s]\n", magicstart, magicend);
    exit(0);
}

int main(int argc, const char **argv)
{
    help();
    return 0;
}
 

結果并沒有按上面的結果輸出, 輸出的是:

        magicstart[CONNTRACLCEND]
        magicend[CEND]

代碼里唯一的差別就是唯一的差別就是變量magiclen, 前面程序中它是const類型的靜態全局變量,后者是非const靜態全局變量,

const類型的靜態全局變量會存儲在在只讀數據段, 非const靜態全局變量存儲在靜態存儲區

后面程序中magicstart沒有數組結束符'\n', 中間如果沒存儲其他類型的數據,在輸出字符數組指針magicstart的內容的時候,會輸出后面連續的字符、

程序中的變量存儲情況可以通過nm進行查看, 可以看到后面的程序magiclen類型是d, 表示全局變量, 類型r表示只讀存儲區

[root@test]$ nm -n -C test1 |grep magic  
0000000000400680 r magicstart
000000000040068c r magiclen
0000000000400690 r magicend
[root@test]$ nm -n -C test2 |grep magic 
0000000000400680 r magicstart
0000000000400689 r magicend
0000000000601034 d magiclen
文章來自個人專欄
文章 | 訂閱
0條評論
作者已關閉評論
作者已關閉評論
0
0