C 語言中的靜態變數

Jinku Hu 2023年1月30日 2021年1月22日
  1. 在 C 語言中使用 static 變數在函式呼叫之間儲存變數值
  2. 在 C 語言中使用 static 關鍵字來宣告檔案範圍內的變數
C 語言中的靜態變數

本文將演示關於如何在 C 語言中使用靜態變數的多種方法。

在 C 語言中使用 static 變數在函式呼叫之間儲存變數值

static 關鍵字在多種情況下使用,其中之一是宣告在函式呼叫之間將其值保留在記憶體中的變數。這種型別的變數有一個靜態的儲存期限。

在下面的例子中,我們在一個函式塊作用域中宣告一個變數 k。當控制流離開 up 函式時,k 的值會在記憶體中持續存在,直到程式退出。可以利用這種行為在程式執行過程中持久地儲存資料物件。

請注意,如果我們不顯式初始化靜態變數,它們會自動初始化為 0。

#include <stdio.h>
#include <stdlib.h>

static int j = 0;

void up(void)
{
    static int k = 0;
    j++;
    k++;
    printf("  up() called. k=%2d, j=%2d\n", k , j);
}

int main()
{
    int i;

    for (i = 0; i < 3; i++)
        up();

    exit(EXIT_SUCCESS);
}

輸出:

up() called. k= 1, j= 1
up() called. k= 2, j= 2
up() called. k= 3, j= 3

在 C 語言中使用 static 關鍵字來宣告檔案範圍內的變數

static 限定變數可以在任何函式外宣告,使其在單個原始檔範圍內可見。這樣的變數稱為具有內部聯絡的靜態變數,也就是說它們的值只能被同一檔案中的函式使用。

注意,這兩個函式都將名為 k 的區域性變數初始化為零,但當 down 函式被呼叫時,變數 k(在 up 中宣告)不在同一範圍內,在不同的記憶體位置初始化了一個新的變數。因此,兩次迭代後顯示負值。注意,函式引數不能有 static 限定符。

#include <stdio.h>
#include <stdlib.h>

static int j = 0;

void up(void)
{
    static int k = 0;
    j++;
    k++;
    printf("  up() called. k=%2d, j=%2d\n", k , j);
}

void down(void)
{
    static int k = 0;
    j--;
    k--;
    printf("down() called. k=%2d, j=%2d\n", k , j);
}

int main()
{
    int i;

    for (i = 0; i < 3; i++)
        up();
    for (i = 0; i < 2; i++)
        down();

    exit(EXIT_SUCCESS);
}

輸出:

up() called. k= 1, j= 1
up() called. k= 2, j= 2
up() called. k= 3, j= 3
down() called. k=-1, j= 2
down() called. k=-2, j= 1
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn