亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

1. 問題來源

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

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

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

2. 問題復現(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ù)組的結構體換兩種寫法,會復現(xiàn)兩種錯誤。

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

typedef struct {
    char body[];
} msg_t;

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

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

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

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

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

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

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

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

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

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

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

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

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

這樣就為結構體指針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;
}

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

msg body:abcdefg

3. 結構體變長數(shù)組使用要點

  • 結構體中不能只有變長數(shù)組一個成員,同時變長數(shù)組必須為結構體最后一個成員。
  • 變長數(shù)組不占用結構體的存儲空間,長度為0,數(shù)組名只是一個占位符。sizeof()計算結構體大小時,變長數(shù)組在其中長度為0。
  • 使用變長數(shù)組結構體時,用malloc()分配內(nèi)存空間。使用完畢用free()可以直接釋放整個結構體的空間。

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

相關文章

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

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

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

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

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

    C++11中使用using的方法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新評論