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

溫馨提示×

溫馨提示×

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

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

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

    安岳县| 毕节市| 潞城市| 平乐县| 曲靖市| 西宁市| 扶绥县| 云梦县| 汪清县| 昌平区| 永兴县| 清流县| 陇南市| 唐河县| 读书| 长寿区| 延边| 怀远县| 扶沟县| 乾安县| 宣城市| 台山市| 安塞县| 武邑县| 牙克石市| 湘乡市| 扶绥县| 鹤庆县| 伽师县| 油尖旺区| 伊金霍洛旗| 上饶县| 台州市| 娄烦县| 子洲县| 金阳县| 焦作市| 阜新市| 宜良县| 武汉市| 文水县|