欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++結(jié)構(gòu)體中變長數(shù)組的使用問題分解刨析

 更新時(shí)間:2022年08月12日 09:03:13   作者:柒號華仔  
變長數(shù)組在C++中指的是集合(也叫容器)如vector就是C語言中,所有的數(shù)組都不定長,沒有下標(biāo)越界的概念,數(shù)組實(shí)質(zhì)就是一個(gè)指針(由數(shù)組名充當(dāng))因此C語言中數(shù)組的長度沒有任何意義平常在C語言中講的不定長數(shù)組,其實(shí)就是指針

1. 問題來源

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

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

問題已經(jīng)解決,由于源程序不方便截取,現(xiàn)在通過一個(gè)實(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)兩種錯(cuò)誤。

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

typedef struct {
    char body[];
} msg_t;

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

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

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

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

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

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

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

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

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

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

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ù)組一個(gè)成員,同時(shí)變長數(shù)組必須為結(jié)構(gòu)體最后一個(gè)成員。
  • 變長數(shù)組不占用結(jié)構(gòu)體的存儲空間,長度為0,數(shù)組名只是一個(gè)占位符。sizeof()計(jì)算結(jié)構(gòu)體大小時(shí),變長數(shù)組在其中長度為0。
  • 使用變長數(shù)組結(jié)構(gòu)體時(shí),用malloc()分配內(nèi)存空間。使用完畢用free()可以直接釋放整個(gè)結(jié)構(gòu)體的空間。

到此這篇關(guān)于C++結(jié)構(gòu)體中變長數(shù)組的使用問題分解刨析的文章就介紹到這了,更多相關(guān)C++變長數(shù)組內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中memset函數(shù)用法詳解

    C++中memset函數(shù)用法詳解

    這篇文章主要介紹了C++中memset函數(shù)用法,結(jié)合實(shí)例形式詳細(xì)分析了memset函數(shù)的功能、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2016-06-06
  • C語言編程題楊氏矩陣算法快速上手示例詳解

    C語言編程題楊氏矩陣算法快速上手示例詳解

    這篇文章主要為大家介紹了C語言編程題楊氏矩陣算法快速上手的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2021-10-10
  • C++11中使用using的方法

    C++11中使用using的方法

    在 C++ 中 using 用于聲明命名空間,使用命名空間也可以防止命名沖突。這篇文章主要介紹了C++11中使用using的方法,需要的朋友可以參考下
    2021-09-09
  • C語言 超詳細(xì)介紹與實(shí)現(xiàn)線性表中的帶頭雙向循環(huán)鏈表

    C語言 超詳細(xì)介紹與實(shí)現(xiàn)線性表中的帶頭雙向循環(huán)鏈表

    帶頭雙向循環(huán)鏈表:結(jié)構(gòu)最復(fù)雜,一般用在單獨(dú)存儲數(shù)據(jù)。實(shí)際中使用的鏈表數(shù)據(jù)結(jié)構(gòu),都是帶頭雙向循環(huán)鏈表。另外這個(gè)結(jié)構(gòu)雖然結(jié)構(gòu)復(fù)雜,但是使用代碼實(shí)現(xiàn)以后會發(fā)現(xiàn)結(jié)構(gòu)會帶來很多優(yōu)勢,實(shí)現(xiàn)反而簡單
    2022-03-03
  • 使用C++制作簡單的web服務(wù)器(續(xù))

    使用C++制作簡單的web服務(wù)器(續(xù))

    本文承接上文《使用C++制作簡單的web服務(wù)器》,把web服務(wù)器做的功能稍微強(qiáng)大些,主要增加的功能是從文件中讀取網(wǎng)頁并返回給客戶端,而不是把網(wǎng)頁代碼寫死在代碼中,有需要的小伙伴來參考下吧。
    2015-03-03
  • OPENCV批量讀取圖片實(shí)現(xiàn)方法

    OPENCV批量讀取圖片實(shí)現(xiàn)方法

    下面小編就為大家?guī)硪黄狾PENCV批量讀取圖片實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的?,F(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • C++讀寫ini配置文件實(shí)現(xiàn)過程詳解

    C++讀寫ini配置文件實(shí)現(xiàn)過程詳解

    這篇文章主要介紹了C++讀寫ini配置文件實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • C++反射的一種實(shí)現(xiàn)方法詳解

    C++反射的一種實(shí)現(xiàn)方法詳解

    這篇文章主要給大家介紹了關(guān)于C++反射的一種實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • 詳解QT使用http通信的同步和異步

    詳解QT使用http通信的同步和異步

    在Qt與Http通信的時(shí)候,會根據(jù)不同的情況使用同步或者異步的方式進(jìn)行數(shù)據(jù)請求,下面我們就來深入了解一下http通信的同步和異步的相關(guān)知識,感興趣的小伙伴可以了解下
    2023-12-12
  • C語言實(shí)例上手深入理解操作符的使用

    C語言實(shí)例上手深入理解操作符的使用

    C 語言提供了豐富的操作符,有:算術(shù)操作符,移位操作符,位操作符,賦值操作符,單目操作符,關(guān)系操作符,邏輯操作符,條件操作符等。接下了讓我們在實(shí)例中練一下
    2022-05-05

最新評論