• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            麒麟子

            ~~

            導航

            <2010年4月>
            28293031123
            45678910
            11121314151617
            18192021222324
            2526272829301
            2345678

            統計

            常用鏈接

            留言簿(12)

            隨筆分類

            隨筆檔案

            Friends

            WebSites

            積分與排名

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

            #

            [導入]引用 病毒是怎么命名的?教你認識病毒命名規則

            引用

            紫色思念引用 病毒是怎么命名的?教你認識病毒命名規則

            引用

            CPU風扇病毒是怎么命名的?教你認識病毒命名規則

            很多時候大家已經用各類安全軟件、殺毒軟件查出了自己的機子中了例如Backdoor.RmtBomb.12、Trojan.Win32.SendIP.15等等這些一串英文還帶數字的病毒名,這時有些人就蒙了,那么長一串的名字,我怎么知道是什么病毒啊?

            其實只要我們掌握一些病毒的命名規則,我們就能通過殺毒軟件的報告中出現的病毒名來判斷該病毒的一些共有的特性了:

            一般格式為:<病毒前綴>.<病毒名>.<病毒后綴>

            病毒前綴是指一個病毒的種類,他是用來區別病毒的種族分類的。不同的種類的病毒,其前綴也是不同的。比如我們常見的木馬病毒的前綴Trojan,蠕蟲病毒的前綴是Worm等等還有其他的。

            病毒名是指一個病毒的家族特征,是用來區別和標識病毒家族的,如以前著名的CIH病毒的家族名都是統一的“CIH”,振蕩波蠕蟲病毒的家族名是“Sasser”。

            病毒后綴是指一個病毒的變種特征,是用來區別具體某個家族病毒的某個變種的。一般都采用英文中的26個字母來表示,如Worm.Sasser.b就是指振蕩波蠕蟲病毒的變種B,因此一般稱為“振蕩波B變種”或者“振蕩波變種B”。如果該病毒變種非常多,可以采用數字與字母混合表示變種標識。

            下面附帶一些常見的病毒前綴的解釋(針對我們用得最多的Windows操作系統):

            1、系統病毒

            系統病毒的前綴為:Win32、PE、Win95、W32、W95等。這些病毒的一般共有的特性是可以感染windows操作系統的*.exe和*.dll文件,并通過這些文件進行傳播。如CIH病毒。

            2、蠕蟲病毒

            蠕蟲病毒的前綴是:Worm。這種病毒的共有特性是通過網絡或者系統漏洞進行傳播,很大部分的蠕蟲病毒都有向外發送帶毒郵件,阻塞網絡的特性。比如沖擊波(阻塞網絡),小郵差(發帶毒郵件)等。

            3、木馬病毒、黑客病毒

            木馬病毒其前綴是:Trojan,黑客病毒前綴名一般為Hack。木馬病毒的共有特性是通過網絡或者系統漏洞進入用戶的系統并隱藏,然后向外界泄露用戶的信息,而黑客病毒則有一個可視的界面,能對用戶的電腦進行遠程控制。木馬、黑客病毒往往是成對出現的,即木馬病毒負責侵入用戶的電腦,而黑客病毒則會通過該木馬病毒來進行控制。現在這兩種類型都越來越趨向于整合了。一般的木馬如QQ消息尾巴木馬Trojan.QQ3344,還有大家可能遇見比較多的針對網絡游戲的木馬病毒如Trojan.LMir.PSW.60。這里補充一點,病毒名中有PSW或者什么PWD之類的一般都表示這個病毒有盜取密碼的功能(這些字母一般都為“密碼”的英文“password”的縮寫)一些黑客程序如:網絡梟雄(Hack.Nether.Client)等。

            4、腳本病毒

            腳本病毒的前綴是:Script。腳本病毒的共有特性是使用腳本語言編寫,通過網頁進行的傳播的病毒,如紅色代碼(Script.Redlof)。腳本病毒還會有如下前綴:VBS、JS(表明是何種腳本編寫的),如歡樂時光(VBS.Happytime)、十四日(Js.Fortnight.c.s)等。

            5、宏病毒

            其實宏病毒是也是腳本病毒的一種,由于它的特殊性,因此在這里單獨算成一類。宏病毒的前綴是:Macro,第二前綴是:Word、Word97、Excel、Excel97(也許還有別的)其中之一。凡是只感染WORD97及以前版本WORD文檔的病毒采用Word97做為第二前綴,格式是:Macro.Word97;凡是只感染WORD97以后版本WORD文檔的病毒采用Word做為第二前綴,格式是:Macro.Word;凡是只感染EXCEL97及以前版本EXCEL文檔的病毒采用Excel97做為第二前綴,格式是:Macro.Excel97;凡是只感染EXCEL97以后版本EXCEL文檔的病毒采用Excel做為第二前綴,格式是:Macro.Excel,以此類推。該類病毒的共有特性是能感染OFFICE系列文檔,然后通過OFFICE通用模板進行傳播,如:著名的美麗莎(Macro.Melissa)。

            6、后門病毒

            后門病毒的前綴是:Backdoor。該類病毒的共有特性是通過網絡傳播,給系統開后門,給用戶電腦帶來安全隱患。

            7、病毒種植程序病毒

            這類病毒的共有特性是運行時會從體內釋放出一個或幾個新的病毒到系統目錄下,由釋放出來的新病毒產生破壞。如:冰河播種者(Dropper.BingHe2.2C)、MSN射手(Dropper.Worm.Smibag)等。

            8、破壞性程序病毒

            破壞性程序病毒的前綴是:Harm。這類病毒的共有特性是本身具有好看的圖標來誘惑用戶點擊,當用戶點擊這類病毒時,病毒便會直接對用戶計算機產生破壞。如:格式化C盤(Harm.formatC.f)、殺手命令(Harm.Command.Killer)等。

            9、玩笑病毒

            玩笑病毒的前綴是:Joke。也稱惡作劇病毒。這類病毒的共有特性是本身具有好看的圖標來誘惑用戶點擊,當用戶點擊這類病毒時,病毒會做出各種破壞操作來嚇唬用戶,其實病毒并沒有對用戶電腦進行任何破壞。如:女鬼(Joke.Girlghost)病毒。

            10、捆綁機病毒

            捆綁機病毒的前綴是:Binder。這類病毒的共有特性是病毒作者會使用特定的捆綁程序將病毒與一些應用程序如QQ、IE捆綁起來,表面上看是一個正常的文件,當用戶運行這些捆綁病毒時,會表面上運行這些應用程序,然后隱藏運行捆綁在一起的病毒,從而給用戶造成危害。如:捆綁QQ(Binder.QQPass.QQBin)、系統殺手(Binder.killsys)等。

            以上為比較常見的病毒前綴,有時候我們還會看到一些其他的,但比較少見,這里簡單提一下:

            DoS:會針對某臺主機或者服務器進行DoS攻擊;

            Exploit:會自動通過溢出對方或者自己的系統漏洞來傳播自身,或者他本身就是一個用于Hacking的溢出工具;

            HackTool:黑客工具,也許本身并不破壞你的機子,但是會被別人加以利用來用你做替身去破壞別人。

            你可以在查出某個病毒以后通過以上所說的方法來初步判斷所中病毒的基本情況,達到知己知彼的效果。在殺毒無法自動查殺,打算采用手工方式的時候這些信息會給你很大的幫助。

            (來源:賽迪網)


            文章來源:http://ly-weiwei.blog.163.com/blog/static/7297528320091815234754

            posted @ 2009-02-08 13:53 麒麟子 閱讀(82) | 評論 (0)編輯 收藏

            最原始,最純樸的快速排序算法

             


            int Partition(int a[],int l,int r)
            {
             int p = a[l];//取首元素作為劃分點

             while(l<r)
             {
              while(l<r&& a[r]>=p)
               --r;
              a[l] = a[r];

              while(l<r&& a[l]<=p)
               ++l;
              a[r] = a[l];
             }
             a[l] = p;
             return l;
            }

            void QSort(int a[],int l,int r)
            {
             int p;
             if(l<r)
             {
              p = Partition(a,l,r);
              for(int i = l; i< r;++i)
              {
               cout<<a[i]<<" ";
              }
              cout<<endl;

              QSort(a,l,p-1);
              QSort(a,p+1,r);
             }
            }

            posted @ 2009-01-04 15:48 麒麟子 閱讀(290) | 評論 (0)編輯 收藏

            [導入]關于math.h

            對于math.h 沒有特別的結構體,一切都就很簡單了。只要知道了各個
            函數的功能就可以了

            函數名:int abs (int x);
            功能:返回整x的絕對值

            函數名:double fabs(double x);
            功能:返回x的絕對值

            函數名:long labs(long x);
            功能:返回x的絕值

            函數名:double cos(double x);
            功能:返回x的余弦
            函數名:double acos(double x);
            功能:返回x的反余弦

            函數名:double cosh(double x);
            功能:返回x的雙余弦

            函數名:double sin( double x);
            功能:返回x的正弦

            函數名:double asin( double x);
            功能:返回x的反正弦

            函數名:double sinh( double x);
            功能:求x的雙正弦

            函數名:double tan ( double x);
            功能:返回x的正切

            函數名:double atan( double x);
            功能:返回x的反正切

            函數名:double atan2(double y,doule x);
            功能:返回x/y的反正切

            函數名:double tanh(double x);
            功能:求x的雙正切

            函數名:double atof( const char *s);
            功能:將字符串s轉換為double型

            函數名:long atol( const char *s);
            功能:將字符串s轉換為long型

            函數名:double ceil(double x);
            功能:返回大于或等于x的最小整數

            函數名:double floor(double x);
            功能:返回小于或等于x的最大整數

            函數名:double exp(double x);
            功能:返回e的x次方

            函數名:double fmod(double x,double y);
            功能:實數的求余運算。是“%”的加強版

            函數名:double frexp(double x,int *exponent);
            功能:設value為函數返回值
                  將x寫成 value乘以(2的exponent次方的形式)
                  value*(2^exponent)

            函數名:double ldexp(double x,int exponent);
            功能:返回x乘以(2的exponent次方)
                  x*(2^exponent)

            函數名:double log(double x);
            功能:求loge(x)

            函數名:double log10(double x);
            功能:求log10(x);

            函數名:double modf(double x,double *ipart);
            功能:將x分成整數和小數部分。小數部份由函數返回,整數由ipart帶出。

            函數名:double pow(double x,double y);
            功能:求x的y次方 x^y

            函數名:double sqrt(double x);
            功能:求x的平方根的絕對值

             

             

             


            文章來源:http://ly-weiwei.blog.163.com/blog/static/729752832008113005832668

            posted @ 2008-12-30 00:59 麒麟子 閱讀(198) | 評論 (0)編輯 收藏

            [導入]關于time.h

            一直對時間函數有點興趣,今天打開time.h看了一下.發現內容也不是太多.于是看了看.這是c庫里的.C++的,改日再看.一邊看一邊寫了總結,呵呵,效果不錯.

            在 time.h 文件中。首先我們可以看到
            typedef long time_t; 這就可以明確地知道 time_t是一個long型
            而為什么要這樣做呢,當然是為了方便代碼的閱讀和理解了
            typedef long clock_t;也是一樣的含義

            另外,還有一個用于存放時間的結構體
            struct tm {
             int tm_sec;
             int tm_min;
             int tm_hour;
             int tm_mday;
             int tm_mon;
             int tm_year;
             int tm_wday;
             int tm_yday;
             int tm_isdst;
            };

            首先來看第一個必須用到的函數

            time_t time (time_t *timer);
            此它用來取得當前的時間相于對1900年所經歷的秒數
            當取得這個秒數以后,我們就可以用其它函數來推算現在的時間了。

            struct tm * localtime(const time_t *timer);

            見名知意。這個函數是用來取得當地時間的。參數即為我們用
            time_t time (time_t *timer);求得的秒數。返回值是tm
            結構,這樣我們可以通過自己的一些方法取得里面的值。比如寫一個
            char * format(const struct tm ) 來格式化成可以輸入的字符串格式
            當然,有專門用于格式化的函數,下面一個便是。


            char asctime (const struct tm *tblock);
            這個函數用來將取得的時間tm結構格式化
            顯示格式如下:Mon Dec 29 23:29:04 2008

            char ctime (const time_t *time);
            此函數也是用來取得本地時間。只是返回類型即為已經被asctime()函數格式化的字符串
            顯示格式即如上所說的Mon Dec 29 23:29:04 2008


            struct tm * gmtime(const time_t *timer);
            此函數用來獲得美國官方日期。返回類型為tm。可以用asctime()格式后輸出,
            也可以自己格式化

            double difftime(time_t time2, time_t time1);
            此函數用來計算time2與time1的差值(time2-time1)。返回雙精度浮點型的數

            clock_t  clock(void);
            這是一個比較有趣的函數。兩次調用它后的差值即為程序所執行的時間。

            注意clock()函數每1/1000秒記數一次,即為毫秒。
            比如 start = clock();
                 for(int i=0;i<100;i++){}
                 end = clock();
            那我們用cost_time = end - start;即可以得到for循環所花費的毫秒數

            關于

            int stime(time_t *tp);
            設置時間

            void tzset(void);
            Unix下兼容時間函數,改日再議

             

             

             

             

             


            文章來源:http://ly-weiwei.blog.163.com/blog/static/72975283200811300058396

            posted @ 2008-12-30 00:01 麒麟子 閱讀(229) | 評論 (0)編輯 收藏

            [導入]各大公司面試題(程序)

            有些題寫得不完整,答案也不完整.我也不知道原理是什么樣子,所以無法改.要看的同學就跳過去吧.如果有好的建議,可以回帖說明.謝謝!

            雖然都是基礎,卻是比較重要的部分.

            一:問答題:
            1.-1,2,7,28,,126請問28和126中間那個數是什么?為什么?
            第一題的答案應該是4^3-1=63
            規律是n^3-1(當n為偶數0,2,4)
                  n^3+1(當n為奇數1,3,5)
            答案:63
            2.用兩個棧實現一個隊列的功能?要求給出算法和思路!
            設2個棧為A,B, 一開始均為空.

            入隊:
            將新元素push入棧A;

            出隊:
            (1)判斷棧B是否為空;
            (2)如果不為空,則將棧A中所有元素依次pop出并push到棧B;
            (3)將棧B的棧頂元素pop出;

            這樣實現的隊列入隊和出隊的平攤復雜度都還是O(1), 比上面的幾種方法要好。

            3.在c語言
            庫函數中將一個字符轉換成整型的函數是atool()嗎,這個函數的原型是什么?
            函數名: atol
            功 能: 把字符串轉換成長整型數
            用 法: long atol(const char *nptr);
            程序例:
            #include <stdlib.h>
            #include <stdio.h>
            int main(void)
            {
            long l;
            char *str = "98765432";

            l = atol(lstr);
            printf("string = %s integer = %ld\n", str, l);
            return(0);
            }
            二;簡答題
            1.對于一個頻繁使用的短小函數,在C語言中應用什么實現,在C++中應用什么實現?
            c用宏定義,c++用inline

            2.直接鏈接兩個信令點的一組鏈路稱作什么?
            PPP點到點連接
             
            3.接入網用的是什么接口?
             
            4.voip都用了那些協議?
             
            5.軟件測試都有那些種類?
            黑盒:針對系統功能的測試    白合:測試函數功能,各函數接口
             
            6.確定模塊的功能和模塊的接口是在軟件設計的那個隊段完成的?
            概要設計階段
             
            7.enum string
                {
                x1,
                x2,
                x3=10,
                x4,
                x5,
                }x;
               問x= 0x801005,0x8010f4  ;
             
            8.unsigned char *p1;
                unsigned long *p2;
                p1=(unsigned char *)0x801000;
                p2=(unsigned long *)0x810000;
                請問p1+5=  ;
                    p2+5=  ;

            三.選擇題:
              1.Ethternet鏈接到Internet用到以下那個協議?
              A.HDLC;B.ARP;C.UDP;D.TCP;E.ID
              2.屬于網絡層協議的是:
              A.TCP;B.IP;C.ICMP;D.X.25
              3.Windows消息調度機制是:
              A.指令隊列;B.指令堆棧;C.消息隊列;D.消息堆棧;
              4.unsigned short hash(unsigned short key)
                {
                  return (key>>)%256
                }
               請問hash(16),hash(256)的值分別是:
              A.1.16;B.8.32;C.4.16;D.1.32


            四.找錯題:
              1.請問下面程序有什么錯誤?
               int a[60][250][1000],i,j,k;
               for(k=0;k<=1000;k++)
                for(j=0;j<250;j++)
                 for(i=0;i<60;i++)
                  a[i][j][k]=0;
            把循環語句內外換一下
              2.#define Max_CB 500
                void LmiQueryCSmd(Struct MSgCB * pmsg)
                 {
                 unsigned char ucCmdNum;
                 ......
               
                 for(ucCmdNum=0;ucCmdNum<Max_CB;ucCmdNum++)
                  {
                  ......;
                  }
            死循環
               3.以下是求一個數的平方的程序,請找出錯誤:
                #define SQUARE(a)((a)*(a))
                int a=5;
                int b;
                b=SQUARE(a++);
               4.typedef unsigned char BYTE
                 int examply_fun(BYTE gt_len; BYTE *gt_code)
                  { 
                  BYTE *gt_buf;
                  gt_buf=(BYTE *)MALLOC(Max_GT_Length);
                  ......
                  if(gt_len>Max_GT_Length)
                    {
                    return GT_Length_ERROR; 
                    }
                    .......
                  }
            五.問答題:
               1.IP Phone的原理是什么?
            IPV6
               2.TCP/IP通信建立的過程怎樣,端口有什么作用?
            三次握手,確定是哪個應用程序使用該協議
               3.1號信令和7號信令有什么區別,我國某前廣泛使用的是那一種?
               4.列舉5種以上的電話新業務?


                       下面是微軟亞洲面試題

            1.進程和線程的差別。
            線程是指進程內的一個執行單元,也是進程內的可調度實體.
            與進程的區別:
            (1)調度:線程作為調度和分配的基本單位,進程作為擁有資源的基本單位
            (2)并發性:不僅進程之間可以并發執行,同一個進程的多個線程之間也可并發執行
            (3)擁有資源:進程是擁有資源的一個獨立單位,線程不擁有系統資源,但可以訪問隸屬于
            進程的資源.
            (4)系統開銷:在創建或撤消進程時,由于系統都要為之分配和回收資源,導致系統的開銷
            明顯大于創建或撤消線程時的開銷。
            2.測試方法
            人工測試:個人復查、抽查和會審
            機器測試:黑盒測試和白盒測試

            2.Heap與stack的差別。
            Heap是堆,stack是棧。
            Stack的空間由操作系統自動分配/釋放,Heap上的空間手動分配/釋放。
            Stack空間有限,Heap是很大的自由存儲區
            C中的malloc函數分配的內存空間即在堆上,C++中對應的是new操作符。
            程序在編譯期對變量和函數分配內存都在棧上進行,且程序運行過程中函數調用時參數的傳
            遞也在棧上進行
            3.Windows下的內存是如何管理的?
            4.介紹.Net和.Net的安全性。
            5.客戶端如何訪問.Net組件實現Web Service?
            6.C/C++編譯器中虛表是如何完成的?
            7.談談COM的線程模型。然后討論進程內/外組件的差別。
            8.談談IA32下的分頁機制
            小頁(4K)兩級分頁模式,大頁(4M)一級
            9.給兩個變量,如何找出一個帶環單鏈表中是什么地方出現環的?
            一個遞增一,一個遞增二,他們指向同一個接點時就是環出現的地方
            10.在IA32中一共有多少種辦法從用戶態跳到內核態?
            通過調用門,從ring3到ring0,中斷從ring3到ring0,進入vm86等等
            11.如果只想讓程序有一個實例運行,不能運行兩個。像winamp一樣,只能開一個窗口,
            怎樣實現?
            用內存映射或全局原子(互斥變量)、查找窗口句柄..
            FindWindow,互斥,寫標志到文件或注冊表,共享內存。.  
            12.如何截取鍵盤的響應,讓所有的‘a’變成‘b’?
            鍵盤鉤子SetWindowsHookEx
             13.Apartment在COM中有什么用?為什么要引入?
             14.存儲過程是什么?有什么用?有什么優點?
            我的理解就是一堆sql的集合,可以建立非常復雜的查詢,編譯運行,所以運行一次后,以
            后再運行速度比單獨執行SQL快很多
             15.Template有什么特點?什么時候用?
            16.談談Windows DNA結構的特點和優點。



                       網絡編程中設計并發服務器的問題




            網絡編程中設計并發服務器,使用多進程 與 多線程 ,請問有什么區別?
            1,進程:子進程是父進程的復制品。子進程獲得父進程數據空間、堆和棧的復制品。
            2,線程:相對與進程而言,線程是一個更加接近與執行體的概念,它可以與同進程的其他
            線程共享數據,但擁有自己的棧空間,擁有獨立的執行序列。
            兩者都可以提高程序的并發度,提高程序運行效率和響應時間。
            線程和進程在使用上各有優缺點:線程執行開銷小,但不利于資源管理和保護;而進程正
            相反。同時,線程適合于在SMP機器上運行,而進程則可以跨機器遷移。



                               思科面試題目
            1. 用宏定義寫出swap(x,y)
            #define swap(x, y)\
            x = x + y;\
            y = x - y;\
            x = x - y;
            2.數組a[N],存放了1至N-1個數,其中某個數重復一次。寫一個函數,找出被重復的數字
            .時間復雜度必須為o(N)函數原型:
            int do_dup(int a[],int N)
            3 一語句實現x是否為2的若干次冪的判斷
            int i = 512;
            cout << boolalpha << ((i & (i - 1)) ? false : true) << endl;
            4.unsigned int intvert(unsigned int x,int p,int n)實現對x的進行轉換,p為起始轉化
            位,n為需要轉換的長度,假設起始點在右邊.如x=0b0001 0001,p=4,n=3轉換后x=0b0110 00
            01
            unsigned int intvert(unsigned int x,int p,int n){
            unsigned int _t = 0;
            unsigned int _a = 1;
            for(int i = 0; i < n; ++i){
            _t |= _a;
            _a = _a << 1;
            }
            _t = _t << p;
            x ^= _t;
            return x;
            }


                          慧通面試題目:



            什么是預編譯,何時需要預編譯:
            1、總是使用不經常改動的大型代碼體。
            2、程序由多個模塊組成,所有模塊都使用一組標準的包含文件和相同的編譯選項。在這
            種情況下,可以將所有包含文件預編譯為一個預編譯頭。
            char * const p;
            char const * p
            const char *p

            上述三個有什么區別?
            char * const p; //常量指針,p的值不可以修改
            char const * p;//指向常量的指針,指向的常量值不可以改
            const char *p; //和char const *p

            char str1[] = "abc";
            char str2[] = "abc";

            const char str3[] = "abc";
            const char str4[] = "abc";

            const char *str5 = "abc";
            const char *str6 = "abc";

            char *str7 = "abc";
            char *str8 = "abc";


            cout << ( str1 == str2 ) << endl;
            cout << ( str3 == str4 ) << endl;
            cout << ( str5 == str6 ) << endl;
            cout << ( str7 == str8 ) << endl;

            結果是:0 0 1 1
            解答:str1,str2,str3,str4是數組變量,它們有各自的內存空間;
            而str5,str6,str7,str8是指針,它們指向相同的常量區域。


            3. 以下代碼中的兩個sizeof用法有問題嗎?[C易]
            void UpperCase( char str[] ) // 將 str 中的小寫字母轉換成大寫字母
            {
                for( size_t i=0; i<sizeof(str)/sizeof(str[0]); ++i )
                    if( 'a'<=str[i] && str[i]<='z' )
                        str[i] -= ('a'-'A' );
            }
            char str[] = "aBcDe";
            cout << "str字符長度為: " << sizeof(str)/sizeof(str[0]) << endl;
            UpperCase( str );
            cout << str << endl;

            答:函數內的sizeof有問題。根據語法,sizeof如用于數組,只能測出靜態數組的大小,
            無法檢測動態分配的或外部數組大小。函數外的str是一個靜態定義的數組,因此其大小為
            4.函數內的str實際只是一個指向字符串的指針,沒有任何額外的與數組相關的信息,因
            此sizeof作用于上只將其當指針看,一個指針為4個字節,因此返回4。

            一個32位的機器,該機器的指針是多少位
            指針是多少位只要看地址總線的位數就行了。80386以后的機子都是32的數據總線。所以指
            針的位數就是4個字節了。

            main()
            {
              int a[5]={1,2,3,4,5};
               int *ptr=(int *)(&a+1);

               printf("%d,%d",*(a+1),*(ptr-1));
            }
            輸出:2,5
            *(a+1)就是a[1],*(ptr-1)就是a[4],執行結果是2,5
            &a+1不是首地址+1,系統會認為加一個a數組的偏移,是偏移了一個數組的大小(本例是5
            個int)
            int *ptr=(int *)(&a+1);
            則ptr實際是&(a[5]),也就是a+5
            原因如下:
            &a是數組指針,其類型為 int (*)[5];
            而指針加1要根據指針類型加上一定的值,
            不同類型的指針+1之后增加的大小不同
            a是長度為5的int數組指針,所以要加 5*sizeof(int)
            所以ptr實際是a[5]
            但是prt與(&a+1)類型是不一樣的(這點很重要)
            所以prt-1只會減去sizeof(int*)
            a,&a的地址是一樣的,但意思不一樣,a是數組首地址,也就是a[0]的地址,&a是對象(數
            組)首地址,a+1是數組下一元素的地址,即a[1],&a+1是下一個對象的地址,即a[5].


            5.請問以下代碼有什么問題:
            int  main()
            {
            char a;
            char *str=&a;
            strcpy(str,"hello");
            printf(str);
            return 0;
            }
            沒有為str分配內存空間,將會發生異常
            問題出在將一個字符串復制進一個字符變量指針所指地址。雖然可以正確輸出結果,但因
            為越界進行內在讀寫而導致程序崩潰。

            char* s="AAA";
            printf("%s",s);
            s[0]='B';
            printf("%s",s);
            有什么錯?
            "AAA"是字符串常量。s是指針,指向這個字符串常量,所以聲明s的時候就有問題。
            cosnt char* s="AAA";
            然后又因為是常量,所以對是s[0]的賦值操作是不合法的。
            6、寫一個“標準”宏,這個宏輸入兩個參數并返回較小的一個。
            .#define Min(X, Y) ((X)>(Y)?(Y):(X))//結尾沒有;
            7、嵌入式系統中經常要用到無限循環,你怎么用C編寫死循環。
            while(1){}或者for(;;)
            8、關鍵字static的作用是什么?
            定義靜態變量
            9、關鍵字const有什么含意?
            表示常量不可以修改的變量。
            10、關鍵字volatile有什么含意?并舉出三個不同的例子?
            提示編譯器對象的值可能在編譯器未監測到的情況下改變。


            int (*s[10])(int) 表示的是什么啊
            int (*s[10])(int) 函數指針數組,每個指針指向一個int func(int param)的函數。


            11.有以下表達式:
            int a=248; b=4;int const c=21;const int *d=&a;
            int *const e=&b;int const *f const =&a;
            請問下列表達式哪些會被編譯器禁止?為什么?
            *c=32;d=&b;*d=43;e=34;e=&a;f=0x321f;
            *c 這是個什么東東,禁止
            *d 說了是const, 禁止
            e = &a 說了是const 禁止
            const *f const =&a; 禁止
            12.交換兩個變量的值,不使用第三個變量。即a=3,b=5,交換之后a=5,b=3;
            有兩種解法, 一種用算術算法, 一種用^(異或)
            a = a + b;
            b = a - b;
            a = a - b;
            or
            a = a^b;// 只能對int,char..
            b = a^b;
            a = a^b;
            or
            a ^= b ^= a;
            13.c和c++中的struct有什么不同?
            c和c++中struct的主要區別是c中的struct不可以含有成員函數,而c++中的struct可以。
            c++中struct和class的主要區別在于默認的存取權限不同,struct默認為public,而clas
            s默認為private
            14.#include <stdio.h>
              #include <stdlib.h>
              void getmemory(char *p)
              {
                p=(char *) malloc(100);
                strcpy(p,"hello world");
              }
              int main( )
              {
                char *str=NULL;
                getmemory(str);
                printf("%s/n",str);
                free(str);
                return 0;
               }
            程序崩潰,getmemory中的malloc 不能返回動態內存, free()對str操作很危險
            15.char szstr[10];
              strcpy(szstr,"0123456789");
              產生什么結果?為什么?
              長度不一樣,會造成非法的OS
            16.列舉幾種進程的同步機制,并比較其優缺點。
               原子操作
            信號量機制
               自旋鎖
               管程,會合,分布式系統

            17.進程之間通信的途徑
            共享存儲系統
            消息傳遞系統
            管道:以文件系統為基礎
            18.進程死鎖的原因
            資源競爭及進程推進順序非法
            19.死鎖的4個必要條件
            互斥、請求保持、不可剝奪、環路
            20.死鎖的處理
            鴕鳥策略、預防策略、避免策略、檢測與解除死鎖
            21.   操作系統中進程調度策略有哪幾種?
            FCFS(先來先服務),優先級,時間片輪轉,多級反饋
            22.類的靜態成員和非靜態成員有何區別?
            類的靜態成員每個類只有一個,非靜態成員每個對象一個
            23.純虛函數如何定義?使用時應注意什么?
            virtual void f()=0;
            是接口,子類必須要實現
            24.數組和鏈表的區別
            數組:數據順序存儲,固定大小
            連表:數據可以隨機存儲,大小可動態改變

            25.ISO的七層模型是什么?tcp/udp是屬于哪一層?tcp/udp有何優缺點?
            應用層
            表示層
            會話層
            運輸層
            網絡層
            物理鏈路層
            物理層
            tcp /udp屬于運輸層
            TCP 服務提供了數據流傳輸、可靠性、有效流控制、全雙工操作和多路復用技術等。
            與 TCP 不同, UDP 并不提供對 IP 協議的可靠機制、流控制以及錯誤恢復功能等。由于
            UDP 比較簡單, UDP 頭包含很少的字節,比 TCP 負載消耗少。
            tcp: 提供穩定的傳輸服務,有流量控制,缺點是包頭大,冗余性不好
            udp: 不提供穩定的服務,包頭小,開銷小  


            26.(void *)ptr 和 (*(void**))ptr的結果是否相同?其中ptr為同一個指針
            .(void *)ptr 和 (*(void**))ptr值是相同的
            27.int main()
               {
                int x=3;
                printf("%d",x);
                return 1;
              
               }
            問函數既然不會被其它函數調用,為什么要返回1?
            mian中,c標準認為0表示成功,非0表示錯誤。具體的值是某中具體出錯信息


            28,要對絕對地址0x100000賦值,我們可以用
            (unsigned int*)0x100000 = 1234;
            那么要是想讓程序跳轉到絕對地址是0x100000去執行,應該怎么做?
            *((void (*)( ))0x100000 ) ( );
            首先要將0x100000強制轉換成函數指針,即:
            (void (*)())0x100000
            然后再調用它:
            *((void (*)())0x100000)();
            用typedef可以看得更直觀些:
            typedef void(*)() voidFuncPtr;
            *((voidFuncPtr)0x100000)();
            29,已知一個數組table,用一個宏定義,求出數據的元素個數
            #define NTBL
            #define NTBL (sizeof(table)/sizeof(table[0]))

            面試題: 線程與進程的區別和聯系? 線程是否具有相同的堆棧? dll是否有獨立的堆棧?

            進程是死的,只是一些資源的集合,真正的程序執行都是線程來完成的,程序啟動的時候
            操作系統就幫你創建了一個主線程。

            每個線程有自己的堆棧。
            DLL中有沒有獨立的堆棧,這個問題不好回答,或者說這個問題本身是否有問題。因為DLL
            中的代碼是被某些線程所執行,只有線程擁有堆棧,如果DLL中的代碼是EXE中的線程所調
            用,那么這個時候是不是說這個DLL沒有自己獨立的堆棧?如果DLL中的代碼是由DLL自己創
            建的線程所執行,那么是不是說DLL有獨立的堆棧?

            以上講的是堆棧,如果對于堆來說,每個DLL有自己的堆,所以如果是從DLL中動態分配的
            內存,最好是從DLL中刪除,如果你從DLL中分配內存,然后在EXE中,或者另外一個DLL中
            刪除,很有可能導致程序崩潰


            unsigned short A = 10;
            printf("~A = %u\n", ~A);

            char c=128;
            printf("c=%d\n",c);

            輸出多少?并分析過程
            第一題,~A =0xfffffff5,int值 為-11,但輸出的是uint。所以輸出4294967285
            第二題,c=0x10,輸出的是int,最高位為1,是負數,所以它的值就是0x00的補碼就是12
            30,所以輸出-128。
            這兩道題都是在考察二進制向int或uint轉換時的最高位處理。

            分析下面的程序:
            void GetMemory(char **p,int num)
            {
                *p=(char *)malloc(num);
               
            }       
            int main()
            {
                char *str=NULL;
               
                GetMemory(&str,100);
               
                strcpy(str,"hello");
               
                free(str);
               
                if(str!=NULL)
                {
                    strcpy(str,"world");
                }   
                   
                printf("\n str is %s",str);
                getchar();
            }   
            問輸出結果是什么?希望大家能說說原因,先謝謝了
            輸出str is world。
            free 只是釋放的str指向的內存空間,它本身的值還是存在的.
            所以free之后,有一個好的習慣就是將str=NULL.
            此時str指向空間的內存已被回收,如果輸出語句之前還存在分配空間的操作的話,這段存儲
            空間是可能被重新分配給其他變量的,
            盡管這段程序確實是存在大大的問題(上面各位已經說得很清楚了),但是通常會打印出
            world來。
            這是因為,進程中的內存管理一般不是由操作系統完成的,而是由庫函數自己完成的。

            當你malloc一塊內存的時候,管理庫向操作系統申請一塊空間(可能會比你申請的大一些
            ),然后在這塊空間中記錄一些管理信息(一般是在你申請的內存前面一點),并將可用
            內存的地址返回。但是釋放內存的時候,管理庫通常都不會將內存還給操作系統,因此你
            是可以繼續訪問這塊地址的。

            char a[10],strlen(a)為什么等于15?運行的結果

            #include "stdio.h"
            #include "string.h"

            void main()
            {

            char aa[10];
            printf("%d",strlen(aa));
            }

            sizeof()和初不初始化,沒有關系;
            strlen()和初始化有關。


            char (*str)[20];/*str是一個數組指針,即指向數組的指針.*/
            char *str[20];/*str是一個指針數組,其元素為指針型數據.*/

            long a=0x801010;
            a+5=?
            0x801010用二進制表示為:“1000 0000 0001 0000 0001 0000”,十進制的值為8392720
            ,再加上5就是8392725.


            文章來源:http://ly-weiwei.blog.163.com/blog/static/7297528320081129389103

            posted @ 2008-12-29 15:08 麒麟子 閱讀(473) | 評論 (0)編輯 收藏

            僅列出標題
            共38頁: First 27 28 29 30 31 32 33 34 35 Last 
            婷婷久久综合九色综合绿巨人| 亚洲第一永久AV网站久久精品男人的天堂AV | 久久妇女高潮几次MBA| 伊人久久大香线蕉亚洲| 91视频国产91久久久| 狠狠色丁香婷婷综合久久来| 国产午夜精品理论片久久 | 亚洲色大成网站WWW久久九九| 久久综合给久久狠狠97色| 香港aa三级久久三级| 思思久久99热只有频精品66| 91久久婷婷国产综合精品青草| 亚洲午夜精品久久久久久app| 国产精品美女久久久m| 亚洲欧美精品一区久久中文字幕| 亚洲欧美日韩中文久久| 久久天天躁狠狠躁夜夜2020老熟妇| 午夜精品久久久久久中宇| 久久亚洲天堂| 国产免费久久久久久无码| 精品免费久久久久久久| 久久SE精品一区二区| 四虎影视久久久免费观看| 精品国产青草久久久久福利| 久久久精品2019免费观看| 精品无码久久久久国产动漫3d| AA级片免费看视频久久| 久久久噜噜噜久久熟女AA片| 久久天天躁狠狠躁夜夜躁2014| 久久久久久久久久免免费精品| 日韩精品久久久久久| 国产精品久久久久久福利漫画| 少妇内射兰兰久久| 久久婷婷色综合一区二区| 久久99精品国产麻豆宅宅| 欧美日韩精品久久久久| 久久无码专区国产精品发布| 亚洲天堂久久久| 亚洲精品高清国产一线久久| 亚洲精品无码久久一线| 久久精品国产亚洲AV无码麻豆|