C++结构体中变长数组如何使用

本篇内容主要讲解“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++结构体中变长数组如何使用”有了更深的了解,不妨来实际操作一番吧!这里是蜗牛博客网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:niceseo99@gmail.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    评论

    有免费节点资源,我们会通知你!加入纸飞机订阅群

    ×
    天气预报查看日历分享网页手机扫码留言评论Telegram