C之goto和void(八)

        我們在 C 語言中經(jīng)常會見到 void,也會偶爾見到 goto。那么 C 語言中既然有 goto,為什么我們在代碼中見的很少呢?在以前很多的項目經(jīng)驗中,我們得到這樣一條潛規(guī)則:一般項目都是禁用 goto 的,程序質(zhì)量與 goto 的出現(xiàn)次數(shù)成反比。自后也就造成了我們一般不會使用 goto 。

創(chuàng)新互聯(lián)長期為上千多家客戶提供的網(wǎng)站建設服務,團隊從業(yè)經(jīng)驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為榆樹企業(yè)提供專業(yè)的成都網(wǎng)站設計、做網(wǎng)站、成都外貿(mào)網(wǎng)站建設公司,榆樹網(wǎng)站改版等技術服務。擁有十多年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

        我們來分析下面這個示例代碼,看看 goto 會帶來什么影響。

#include <stdio.h>
#include <malloc.h>

void func(int n)
{
    int* p = NULL;

    if(  n < 0 )
    {
        goto STATUS;
    }

    p = (int*)malloc(sizeof(int) * n);
    
STATUS:
    p[0] = n;    
    
    free(p);
}

int main()
{  
    printf("begin...\n");
    
    printf("func(1)\n");
    func(1);
    
    printf("func(-1)\n");
    func(-1);
    
    printf("end...\n");
    
    return 0;
}

        那么在 function(1) 中,函數(shù)會正常執(zhí)行退出。在 function(-1) 中,函數(shù)則會發(fā)生段錯誤,為什么呢?因為 goto 改變了函數(shù)的執(zhí)行流。指針 p 沒有申請就要使用并釋放。我們來看看編譯的結(jié)果是否如我們所想?經(jīng)過編譯, 我們發(fā)現(xiàn)雖然函數(shù)能編譯過,但是執(zhí)行的時候發(fā)生了段錯誤。

C之 goto 和 void(八)

       下來我們來講講 void。當函數(shù)沒有返回值時,應將其聲明為 void;如果函數(shù)沒有參數(shù),應將其參數(shù)聲明為 void;void 修飾函數(shù)返回值和參數(shù)是為了表示“無”。那么在 C 語言中,到底有沒有定義 void 的內(nèi)存大小呢?在標準的 C 中是沒有定義它的大小的,但是在一些 C 的擴展編譯器中定義了。比如在 gcc 編譯器中就定義 void 的大小為 1。我們可以在 gcc 編譯器中試下,結(jié)果如下所示:

C之 goto 和 void(八)

        那么對于 void 指針有什么意義呢?C 語言規(guī)定只有相同類型的指針才能相互賦值,void* 指針作為左值用于“接收”任意類型的指針,void* 指針作為右值使用時需要進行強制類型轉(zhuǎn)換。

        我們來通過  void* 實現(xiàn) MemSet 函數(shù),具體代碼如下:

#include <stdio.h>

void MemSet(void* src, int length, unsigned char n)
{
    unsigned char* p = (unsigned char*)src;
    
    int i = 0;
    
    for(i=0; i<length; i++)
    {
        p[i] = n;
    }
}

int main()
{
    int a[5];
    int i = 0;
    
    MemSet(a, sizeof(a), 0);
    
    for(i=0; i<5; i++)
    {
        printf("%d\n", a[i]);
    }
    
    return 0;
}

        我們可以看到因為 MemSet 函數(shù)的第一個參數(shù)為 void* ,所以數(shù)組 a 的類型不管是 int、char、float還是 double,都不會報錯。但是如果我們規(guī)定的是 int* 的話,下面數(shù)組 a 的類型為 double的話,就會報錯。我們改成這樣試試,看編譯器是否會報錯。效果如下:C之 goto 和 void(八)

        那么我們本次學習了 goto 和 void,通過本次學習,總結(jié)如下:1、在現(xiàn)在的項目工程中一般是禁用 goto 語句的;2、void 是一種抽象的數(shù)據(jù)類型;3、void 類型不能用于定義變量、但可以用來聲明函數(shù)無參數(shù)、無返回值;4、可以定義 void*類型的指針;5、void* 類型的指針可以接受任意類型的指針值。后面我們會繼續(xù)對 C 語言的學習。

         歡迎大家一起來學習 C 語言,可以加我QQ:243343083。

分享標題:C之goto和void(八)
地址分享:http://www.muchs.cn/article30/jpjiso.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供電子商務企業(yè)網(wǎng)站制作、網(wǎng)站建設品牌網(wǎng)站設計、網(wǎng)站導航用戶體驗

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)