亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

C++結構體中變長數組如何使用

發布時間:2022-08-12 10:44:23 來源:億速云 閱讀:263 作者:iii 欄目:開發技術

本篇內容主要講解“C++結構體中變長數組如何使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“C++結構體中變長數組如何使用”吧!

    1. 問題來源

    今天在結構體里面使用變長數組來封裝消息體,運行程序時彈出如下錯誤:

    *** stack smashing detected ***: <unknown> terminated
    Aborted (core dumped)

    問題已經解決,由于源程序不方便截取,現在通過一個實例來復現問題。

    2. 問題復現

    2.1 初始程序

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    typedef struct {
        int a;
        char body[];
    } msg_t;
    int main(void)
    {
        msg_t msg;
        char *pdu = "abcdefg";
        strcpy(msg.body,pdu);
        printf("msg body:%s\n",msg.body);
        return 0;
    }

    上述程序編譯是沒有問題的,但如果帶變長數組的結構體換兩種寫法,會復現兩種錯誤。

    2.2 獨立變長數組復現

    typedef struct {
        char body[];
    } msg_t;

    結構體中只有變長數組body[],無其他成員。編譯錯誤如下:

    test.c:7:10: error: flexible array member in a struct with no named members
         char body[];

    這種情況在實際中并不會出現,如果只有一個成員,就沒必要多一層結構體。

    2.3 變長數組置前復現

    typedef struct {
    	char body[];
    	int a;
    } msg_t;

    變長數組body[]不為結構最后一個成員。編譯錯誤如下:

    test.c:7:10: error: flexible array member not at end of struct
         char body[];

    這種情況就是按照C99標準變長數組必須是結構體的最后一個成員。

    2.4 緩沖區溢出復現

    運行編譯出的可執行程序,打印錯誤如下:

    msg body:abcdefg
    *** stack smashing detected ***: <unknown> terminated
    Aborted (core dumped)

    這里是因為沒有為變長數組body分配內存,檢測到了緩沖區溢出,通過如下表達式分配內存:

    msg_t *msg= (msg_t*)malloc(sizeof(msg_t)+16*sizeof(char));

    這樣就為結構體指針msg分配了一塊內存空間,程序變為:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    typedef struct {
        int a;
        char body[];
    } msg_t;
    int main(void)
    {
        msg_t *msg = (msg_t*)malloc(sizeof(msg_t)+16*sizeof(char));
        char *pdu = "abcdefg";
        strcpy(msg->body,pdu);
        printf("msg body:%s\n",msg->body);
        free(msg);
        return 0;
    }

    編譯成功,運行結果正常:

    msg body:abcdefg

    3. 結構體變長數組使用要點

    • 結構體中不能只有變長數組一個成員,同時變長數組必須為結構體最后一個成員。

    • 變長數組不占用結構體的存儲空間,長度為0,數組名只是一個占位符。sizeof()計算結構體大小時,變長數組在其中長度為0。

    • 使用變長數組結構體時,用malloc()分配內存空間。使用完畢用free()可以直接釋放整個結構體的空間。

    到此,相信大家對“C++結構體中變長數組如何使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

    向AI問一下細節

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

    c++
    AI

    登封市| 大连市| 湖口县| 南漳县| 武鸣县| 阿城市| 兰西县| 突泉县| 中宁县| 新乡县| 邯郸市| 织金县| 桐庐县| 大英县| 无极县| 阜新市| 腾冲县| 尚志市| 砀山县| 新田县| 岗巴县| 乌什县| 特克斯县| 天镇县| 广德县| 青阳县| 临清市| 焦作市| 儋州市| 铜鼓县| 方正县| 巴林右旗| 本溪市| 贵阳市| 洪雅县| 庆云县| 河北区| 遂溪县| 乌拉特前旗| 区。| 莱芜市|