這裡用區域性靜態變數對嗎?

2021-08-31 12:23:21 字數 1389 閱讀 1224

《c陷阱與缺陷》3.6節「邊界計算與不對稱邊界」中最後乙個例子(第52頁至57頁),按照書上的**編譯生成的程式不能正確實現「flush()」函式的功能。

本來期望列印內容是(以列印42個整數為例):

1       6      11

2       7      12

3       8      13

4       9      14

5      10      15

-----------------------------

16      21      26

17      22      27

18      23      28

19      24      29

20      25      30

-----------------------------

31      36      41

32      37      42

flush()...

33      38

34      39

35      40

-----------------------------

但是用書上的**,會重複列印最後一頁兩行兩列的內容:

31      36      41

32      37      42

31      36      

32      37

33      38

34      39

35      40

只要將print()中的row改為全域性變數,並且把flush()中的row的宣告和初始化為0的**去掉才能實現期望的正確輸出。

要按說,這本書是c語言經典之作,印刷次數很多,不可能有這種錯誤的。也許是我看走眼了?

不管了,先把我認為正確的**記下來再說。

#include #define nrows   5

#define ncols 3

#define bufsize (nrows *(ncols - 1))

int buffer[bufsize];

int *bufptr;

static int row = 0;

void printnum(int num);

void printnl(void);

void printpage(void);

void print(int n);

void flush(void);

int main()

printpage();

}}

區域性靜態變數

全域性變數,區域性靜態變數,全域性靜態變數均儲存在靜態儲存區,區域性變數儲存在棧上,而new出來的變數則儲存在堆裡。區域性靜態變數具有區域性作用域,它只被初始化一次,到程式結束前都一直存在,在自身函式體內是可見的,在函式體外是不可見的。而區域性變數只是在函式體內存在,函式結束時消失 全域性變數則是在...

區域性變數,區域性靜態變數,全域性變數,全域性靜態變數分別

c 記憶體到底分幾個區?一 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶,呵呵。3 全域性...

全域性變數,全域性靜態變數,區域性靜態變數,區域性變數

變數可以分為全域性變數 靜態全域性變數 靜態區域性變數和區域性變數。按照儲存區分 全域性變數 靜態全域性變數和靜態區域性變數都存放在記憶體的全域性資料區,區域性變數存放在記憶體的棧區。按作用域分 全域性變數在整個工程檔案內都有效 靜態全域性變數只在定義它的檔案內有效 靜態區域性變數只在定義它的函式內...