中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C之 goto 和 void(八)

發布時間:2020-07-07 15:23:26 來源:網絡 閱讀:757 作者:上帝之子521 欄目:編程語言

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

        我們來分析下面這個示例代碼,看看 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) 中,函數會正常執行退出。在 function(-1) 中,函數則會發生段錯誤,為什么呢?因為 goto 改變了函數的執行流。指針 p 沒有申請就要使用并釋放。我們來看看編譯的結果是否如我們所想?經過編譯, 我們發現雖然函數能編譯過,但是執行的時候發生了段錯誤。

C之 goto 和 void(八)

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

C之 goto 和 void(八)

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

        我們來通過  void* 實現 MemSet 函數,具體代碼如下:

#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 函數的第一個參數為 void* ,所以數組 a 的類型不管是 int、char、float還是 double,都不會報錯。但是如果我們規定的是 int* 的話,下面數組 a 的類型為 double 的話,就會報錯。我們改成這樣試試,看編譯器是否會報錯。效果如下:C之 goto 和 void(八)

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


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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

屯留县| 丁青县| 成安县| 栾城县| 隆回县| 湖州市| 秦皇岛市| 德令哈市| 义马市| 临夏市| 平武县| 巢湖市| 惠东县| 仁布县| 桃园市| 松溪县| 贺州市| 维西| 晋州市| 金乡县| 乌鲁木齐市| 垫江县| 双柏县| 广南县| 从化市| 农安县| 秀山| 遵化市| 桃园县| 麻栗坡县| 德兴市| 友谊县| 玛沁县| 富阳市| 师宗县| 五河县| 隆德县| 土默特右旗| 准格尔旗| 三门峡市| 格尔木市|