目录1.问题来源2.问题复现2.1初始程序2.2独立变长数组复现2.3变长数组置前复现2.4缓冲区溢出复现3.结构体变长数组使用要点1.问题来源今天在结构体里面使用变长数组来封装消息体...
1. 问题来源
今天在结构体里面使用变长数组来封装消息体,运行程序时弹出如下错误:
截取,现在通过一个实例来复现问题。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++结构体中变长数组的使用问题分解刨析的文章就介绍到这了,更多相关C++变长数组内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
本文标题为:C++结构体中变长数组的使用问题分解刨析


- C++ 数据结构超详细讲解顺序表 2023-03-25
- Easyx实现扫雷游戏 2023-02-06
- C语言手把手带你掌握带头双向循环链表 2023-04-03
- ubuntu下C/C++获取剩余内存 2023-09-18
- Qt计时器使用方法详解 2023-05-30
- C语言qsort()函数的使用方法详解 2023-04-26
- 我应该为我的项目使用相对包含路径,还是将包含目录放在包含路径上? 2022-10-30
- C语言详解float类型在内存中的存储方式 2023-03-27
- c++ const 成员函数,返回一个 const 指针.但是返回的指针是什么类型的 const? 2022-10-11
- 详解C语言中sizeof如何在自定义函数中正常工作 2023-04-09