栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【C/C++】结构体中使用变长数组问题分析

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【C/C++】结构体中使用变长数组问题分析

目录
    • 1. 问题来源
    • 2. 问题复现
      • 2.1 初始程序
      • 2.2 独立变长数组复现
      • 2.3 变长数组置前复现
      • 2.4 缓冲区溢出复现
    • 3. 结构体变长数组使用要点

1. 问题来源

今天在结构体里面使用变长数组来封装消息体,运行程序时弹出如下错误:

*** stack smashing detected ***:  terminated
Aborted (core dumped)

问题已经解决,由于源程序不方便截取,现在通过一个实例来复现问题。


2. 问题复现 2.1 初始程序
#include 
#include 
#include 

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

int main(void)
{
    msg_t msg;
    char *pdu = "abcdefg";
    strcpy(msg.body,pdu);
    printf("msg body:%sn",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 ***:  terminated
Aborted (core dumped)

这里是因为没有为变长数组body分配内存,检测到了缓冲区溢出,通过如下表达式分配内存:

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

这样就为结构体指针msg分配了一块内存空间,程序变为:

#include 
#include 
#include 

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:%sn",msg->body);
    free(msg);

    return 0;
}

编译成功,运行结果正常:

msg body:abcdefg

3. 结构体变长数组使用要点
  • 结构体中不能只有变长数组一个成员,同时变长数组必须为结构体最后一个成员。
  • 变长数组不占用结构体的存储空间,长度为0,数组名只是一个占位符。sizeof()计算结构体大小时,变长数组在其中长度为0。
  • 使用变长数组结构体时,用malloc()分配内存空间。使用完毕用free()可以直接释放整个结构体的空间。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/997012.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号