溫馨提示×

溫馨提示×

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

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

C++結(jié)構(gòu)體中變長數(shù)組如何使用

發(fā)布時間:2022-08-12 10:44:23 來源:億速云 閱讀:258 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“C++結(jié)構(gòu)體中變長數(shù)組如何使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“C++結(jié)構(gòu)體中變長數(shù)組如何使用”吧!

    1. 問題來源

    今天在結(jié)構(gòu)體里面使用變長數(shù)組來封裝消息體,運(yùn)行程序時彈出如下錯誤:

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

    問題已經(jīng)解決,由于源程序不方便截取,現(xiàn)在通過一個實(shí)例來復(fù)現(xiàn)問題。

    2. 問題復(fù)現(xiàn)

    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;
    }

    上述程序編譯是沒有問題的,但如果帶變長數(shù)組的結(jié)構(gòu)體換兩種寫法,會復(fù)現(xiàn)兩種錯誤。

    2.2 獨(dú)立變長數(shù)組復(fù)現(xiàn)

    typedef struct {
        char body[];
    } msg_t;

    結(jié)構(gòu)體中只有變長數(shù)組body[],無其他成員。編譯錯誤如下:

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

    這種情況在實(shí)際中并不會出現(xiàn),如果只有一個成員,就沒必要多一層結(jié)構(gòu)體。

    2.3 變長數(shù)組置前復(fù)現(xiàn)

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

    變長數(shù)組body[]不為結(jié)構(gòu)最后一個成員。編譯錯誤如下:

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

    這種情況就是按照C99標(biāo)準(zhǔn)變長數(shù)組必須是結(jié)構(gòu)體的最后一個成員。

    2.4 緩沖區(qū)溢出復(fù)現(xiàn)

    運(yùn)行編譯出的可執(zhí)行程序,打印錯誤如下:

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

    這里是因?yàn)闆]有為變長數(shù)組body分配內(nèi)存,檢測到了緩沖區(qū)溢出,通過如下表達(dá)式分配內(nèi)存:

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

    這樣就為結(jié)構(gòu)體指針msg分配了一塊內(nèi)存空間,程序變?yōu)椋?/p>

    #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;
    }

    編譯成功,運(yùn)行結(jié)果正常:

    msg body:abcdefg

    3. 結(jié)構(gòu)體變長數(shù)組使用要點(diǎn)

    • 結(jié)構(gòu)體中不能只有變長數(shù)組一個成員,同時變長數(shù)組必須為結(jié)構(gòu)體最后一個成員。

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

    • 使用變長數(shù)組結(jié)構(gòu)體時,用malloc()分配內(nèi)存空間。使用完畢用free()可以直接釋放整個結(jié)構(gòu)體的空間。

    到此,相信大家對“C++結(jié)構(gòu)體中變長數(shù)組如何使用”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    c++
    AI