基於C語言 長跳轉的實現

2021-04-30 20:28:56 字數 1041 閱讀 7833

在網路上看到的別人寫的文章,覺得解析得不錯,就貼過來了!

長跳轉(long jump)的原理是:設定一條語句的唯一標識(setjmp(jmp_buf jmpb)),再通過長跳轉(longjmp(jmp_buf jmpb, int retval))

轉到jmpb所標識的語句。

先看一下setjmp和longjmp這兩個函式的用法吧。

函式名:  setjmp

函式原型:int _cdecl setjmp(jmp_buf jmpb);

作用:    設定非本地跳轉。即乙個返回點,當程式呼叫longjmp函式(不論longjmp()和setjmp()是否在同乙個函式或同乙個作用域。)時,

就可以返回到這個返回點,繼續從這個點往下執行。

形參:    jmpb用來保護現場。

返回值:  首次呼叫返回0,當longjmp()返回時,呼叫返回值用longjmp()設定。

函式名:  longjmp

函式原型:void _cdecl longjmp(jmp_buf jmpb, int retval);

作用:    返回到setjmp()所設定的返回點。

形參:    jmpb:用於恢復現場(由呼叫setjmp()時設定的)

retval:返回到setjmp()所在的位置時,設定第二次setjmp()的返回值。

返回值:  無

再來看看它的使用例子吧。

#include

#include

#include

void longjmpfun(jmp_buf jumppointer);

int main(void)

else

return 0;

}void longjmpfun(jmp_buf jumppointer)

執行結果:

function "setjmp" return value: 0

be about to call longjmp...

be in longjmpfun

function "setjmp" return value: 10

LZW基於C語言的實現

lzw演算法具有很多版本,其大致思想一致。主要思想是盡最大可能不產生冗餘,以自適應的方式建立乙個內部字典。其演算法流程如下 lzw演算法流程 步驟1 開始時的詞典包含所有可能的根 root 而當前字首p是空的 步驟2 當前字元 c 字元流中的下乙個字元 步驟3 判斷綴 符串p c是否在詞典中 1 如...

基於HTTP的長輪詢簡單實現

web客戶端與伺服器之間基於ajax http 的常用通訊方式,分為短連線與長輪詢。短連線 客戶端和伺服器每進行一次http操作,就建立一次連線,任務結束就中斷連線。在長輪詢機制中,客戶端像傳統輪詢一樣從伺服器請求資料。然而,如果伺服器沒有可以立即返回給客戶端的資料,則不會立刻返回乙個空結果,而是保...

基於C語言的B 樹的實現

用下圖所示的方式描述軟體的功能結構。b 樹的查詢過程 根據給定值查詢結點和在結點的關鍵字中進行查詢交叉進行。首先從根結點開始重複如下過程 若比結點的第乙個關鍵字小,則查詢在該結點第乙個指標指向的結點進行 若等於結點中某個關鍵字,則查詢成功 若在兩個關鍵字之間,則查詢在它們之間的指標指向的結點進行 若...