最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

1. 問題來源

今天在結(jié)構(gòu)體里面使用變長(zhǎng)數(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;
}

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

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

typedef struct {
    char body[];
} msg_t;

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

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

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

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

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

變長(zhǎng)數(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)變長(zhǎng)數(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)闆]有為變長(zhǎng)數(shù)組body分配內(nèi)存,檢測(cè)到了緩沖區(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)體變長(zhǎng)數(shù)組使用要點(diǎn)

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

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

相關(guān)文章

  • 詳解進(jìn)程同步與互斥機(jī)制

    詳解進(jìn)程同步與互斥機(jī)制

    進(jìn)程同步是一個(gè)操作系統(tǒng)級(jí)別的概念,是在多道程序的環(huán)境下,存在著不同的制約關(guān)系,為了協(xié)調(diào)這種互相制約的關(guān)系,實(shí)現(xiàn)資源共享和進(jìn)程協(xié)作,從而避免進(jìn)程之間的沖突,引入了進(jìn)程同步
    2021-06-06
  • 利用C語言實(shí)現(xiàn)經(jīng)典多級(jí)時(shí)間輪定時(shí)器

    利用C語言實(shí)現(xiàn)經(jīng)典多級(jí)時(shí)間輪定時(shí)器

    C語言是一門通用計(jì)算機(jī)編程語言,廣泛應(yīng)用于底層開發(fā),這篇文章主要給大家介紹了關(guān)于利用C語言實(shí)現(xiàn)經(jīng)典多級(jí)時(shí)間輪定時(shí)器的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • C++實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)(完整版)

    C++實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)(完整版)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++歸并排序算法實(shí)例

    C++歸并排序算法實(shí)例

    這篇文章主要介紹了C++歸并排序算法實(shí)例,本文先是介紹了什么是歸并排序,然后給出了實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2014-10-10
  • c++中移動(dòng)語義和完美轉(zhuǎn)發(fā)及易錯(cuò)點(diǎn)

    c++中移動(dòng)語義和完美轉(zhuǎn)發(fā)及易錯(cuò)點(diǎn)

    C++ 中的移動(dòng)語義和完美轉(zhuǎn)發(fā)是 C++11 引入的兩個(gè)重要特性,它們分別用于提高性能和靈活性,這篇文章主要介紹了c++中移動(dòng)語義和完美轉(zhuǎn)發(fā),需要的朋友可以參考下
    2023-09-09
  • 手把手教你如何優(yōu)化C語言程序

    手把手教你如何優(yōu)化C語言程序

    程序進(jìn)行優(yōu)化,通常是指優(yōu)化程序代碼或程序執(zhí)行速度。優(yōu)化代碼和優(yōu)化速度實(shí)際上是一個(gè)予盾的統(tǒng)一,一般是優(yōu)化了代碼的尺寸,就會(huì)帶來執(zhí)行時(shí)間的增加,如果優(yōu)化了程序的執(zhí)行速度,通常會(huì)帶來代碼增加的副作用,很難魚與熊掌兼得,只能在設(shè)計(jì)時(shí)掌握一個(gè)平衡點(diǎn)
    2013-07-07
  • 對(duì)C++ string append方法的常用用法詳解

    對(duì)C++ string append方法的常用用法詳解

    今天小編就為大家分享一篇對(duì)C++ string append方法的常用用法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • 排序算法模板實(shí)現(xiàn)示例分享

    排序算法模板實(shí)現(xiàn)示例分享

    這篇文章主要介紹了排序算法模板實(shí)現(xiàn)示例,需要的朋友可以參考下
    2014-03-03
  • Cocos2d-x UI開發(fā)之CCControlColourPicker控件類使用實(shí)例

    Cocos2d-x UI開發(fā)之CCControlColourPicker控件類使用實(shí)例

    這篇文章主要介紹了Cocos2d-x UI開發(fā)之CCControlColourPicker控件類使用實(shí)例,本文代碼中包含大量注釋來講解CCControlColourPicker控件類的使用,需要的朋友可以參考下
    2014-09-09
  • C語言小項(xiàng)目計(jì)時(shí)器的實(shí)現(xiàn)思路(倒計(jì)時(shí)+報(bào)警提示)

    C語言小項(xiàng)目計(jì)時(shí)器的實(shí)現(xiàn)思路(倒計(jì)時(shí)+報(bào)警提示)

    這篇文章主要介紹了C語言小項(xiàng)目計(jì)時(shí)器(倒計(jì)時(shí)+報(bào)警提示)的實(shí)現(xiàn)思路,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11

最新評(píng)論

阿拉善盟| 新宾| 黎城县| 莒南县| 宝兴县| 云和县| 丽江市| 潜山县| 衡南县| 托克逊县| 长汀县| 大庆市| 商丘市| 通州市| 运城市| 龙口市| 会东县| 葫芦岛市| 盐边县| 丁青县| 香格里拉县| 周宁县| 高州市| 大新县| 桂东县| 湘潭市| 什邡市| 丰都县| 宝兴县| 宁城县| 安泽县| 顺平县| 武乡县| 南江县| 喀喇沁旗| 措勤县| 海安县| 石屏县| 罗定市| 汝阳县| 海伦市|