当前位置: 首页 > news >正文

化妆品网站下载展厅设计公司成都

化妆品网站下载,展厅设计公司成都,贵州省建设厅住房和城乡建设官网,做seo网站图片怎么优化其实标题应该去掉C的。柔性数组是C99中新增的一个特性。 介绍 柔性数组(Flexible Array Member,简称FAM)是C99标准引入的一个特性,允许结构体的最后一个成员是一个未指定大小的数组。这种设计通常用于实现可变长度的数据结构&am…

其实标题应该去掉C++的。柔性数组是C99中新增的一个特性。

介绍

柔性数组(Flexible Array Member,简称FAM)是C99标准引入的一个特性,允许结构体的最后一个成员是一个未指定大小的数组。这种设计通常用于实现可变长度的数据结构,比如动态缓冲区、消息包等。

使用

struct Packet {int type;int length;char data[];  // 柔性数组成员
};

由于 data[] 没有大小,不能直接定义该结构体的变量,但可以动态分配内存。
比如说我现在要数组里面有100个元素,现在进行malloc一下:

#include<stdlib.h>
#include<memory.h>int data_size = 100;
struct Packet *pkt = malloc(sizeof(struct Packet) + data_size * sizeof(char));
if (pkt) {pkt->type = 1;pkt->length = data_size;strcpy(pkt->data, "Hello, world!");
}
// 使用完毕后释放
free(pkt);

如果你使用C++,那上面的代码是编译不过的。

fm.cc: 在函数‘int main()’中:
fm.cc:13:32: 错误:invalid conversion from ‘void*’ to ‘Packet*’ [-fpermissive]struct Packet *pkt = malloc(sizeof(struct Packet) + data_size * sizeof(char));~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

在 C++ 中,malloc 返回的是 void* 类型。C++ 不允许隐式地将 void* 转换为其他指针类型,这是为了类型安全。但是C就可以这么做。

如果是C++,这行代码需要加上强制转换:

struct Packet *pkt = static_cast<Packet*>(malloc(sizeof(struct Packet) + data_size * sizeof(char)));

ISO C++并不支持柔性数组成员,但是gcc在这里是能编译通过的。
引用gcc官网的原文:https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html#Zero-Length

The GCC extension accepts a structure containing an ISO C99 flexible array
member, or a union containing such a structure (possibly recursively)
to be a member of a structure.

相当于gcc只是作为扩展支持c才引入对柔性数组的支持的,并非C++标准。

优点

大家都在用,不太可能是因为柔性数组难用才故意折磨自己吧。柔性数组在性能上有替代品无法比拟的优势。

我们设想一下,上述代码不使用柔性数组,而是使用指针需要怎么写?

int main()
{int data_size = 100;struct Packet *pkt = static_cast<Packet *>(malloc(sizeof(struct Packet)));if (pkt){pkt->type = 1;pkt->length = data_size;char *data = static_cast<char *>(malloc(data_size * sizeof(char)));strcpy(pkt->data, "Hello, world!");}// 使用完毕后释放free(pkt->data);free(pkt);
}

这存在两个问题:

  1. 不能保证data的内存和前面两个成员是连续的。这会降低CPU缓存的命中率。而且不方便进行序列化(比如使用memcpy对整块进行复制)
  2. 相比柔性数组的写法,多分配/释放了一次内存(对data)这样不仅劣化了性能,当结构体对外部封装时,外部也需要分配/释放两次内存(仅针对C语言,毕竟没办法给结构体写成员函数。。。)

问题

最大的问题就是,通用的sizeof并不适用带有柔性数组成员的结构体。

比如越界访问:

pkt->data[200] = 'a';  // 如果只分配了100字节,就会越界

内存大小的错误计算:

malloc(sizeof(struct Packet) + data_size * sizeof(char));  // 正确
// 但容易误写为:
malloc(sizeof(struct Packet));  // 错误:data未分配空间

memcpy在操作的时候也需要注意。说白了,柔性数组的设计也体现了C的设计哲学,也就是给予程序员充分的权力,但是需要程序员自己注意内存分配的问题。但是这问题是注意不了一点。

注意

C99标准本身针对柔性数组的使用给出了指导原则6.7.2.1 §18:

As a special case, the last element of a structure with more than one named member may have an incomplete array type; this is called a flexible array member.

先指出一个问题,就是char data[]并不是指针。data[] 是一个数组类型,但它的大小是未指定的(unspecified)。它不是指针(char*),也不是长度为 0 的数组。它是一个 “不完整类型”(incomplete type),直到你动态分配内存时才“完成”。

类似extern char data[],对其采用sizeof是非法行为。下面绝大多数注意都基于这个原则。

FAM 必须是最后一个成员

❌ 非法示例:

struct Bad {char data[];  // ❌ 后面还有成员int crc;      // 错误:FAM 不在末尾
};

包含 FAM 的结构体必须至少有两个命名成员

❌ 非法示例:

struct OnlyFAM {char data[];  // ❌ 错误:只有一个成员(即使它是 FAM)
};

不能计算柔性数组本身的大小(sizeof 非法)

❌ 非法示例:

struct Packet pkt;
sizeof(pkt.data);     // ❌ 错误:不能对 FAM 使用 sizeof

不能定义包含 FAM 的结构体的数组

❌ 非法示例:

struct Packet {int type;char data[];
};struct Packet packets[10];  // ❌ 编译错误

包含 FAM 的结构体不能作为另一个结构体的成员

❌ 非法示例:

struct Inner {int len;char data[];
};struct Outer {int tag;struct Inner inner;  // ❌ 错误:FAM 结构体不能嵌套
};

不能对包含 FAM 的结构体使用 sizeof 来分配内存(需手动计算)

❌ 非法示例:

struct Packet *pkt = malloc(sizeof(struct Packet));             // ❌ data[] 无空间

不能直接初始化或赋值包含 FAM 的结构体

❌ 非法示例:

struct Packet p = {1, "hello"};  // ❌ 错误:不能初始化 FAM
struct Packet q = p;             // ❌ 错误:不能赋值
http://www.dtcms.com/a/434162.html

相关文章:

  • 张家界网站制作公司手机wordpress上传失败
  • 网站的设计流程是怎么样的?dw网页设计源代码
  • 建站公司推广如何建双注册网站
  • 做搜狗pc网站优化快速代加工厂找订单的网站
  • 网站开发新加坡网页设计代码链接怎么写
  • 网站重构案例wordpress响应式加后台
  • 做基础销量的网站什么是网站栏目标题
  • 商城网站制作公司地址苏州营销型网站开发公司
  • 1个月能学好网站开发吗wordpress搜索小工具
  • 科技节小发明小制作营销网站的专业性诊断评价和优化
  • 做任务兼职赚钱的网站有哪些网站建设的流程与思路
  • 铜仁市网站建设情况浙江seo公司
  • 哪个网站专做民宿科普网站建设
  • 蜜淘app在那个网站做的济南网站建设网站制作
  • 北京网站制作 建设推广网站需求定制表单
  • 袜子的网站建设方案贵州省住房和城乡建设厅网站
  • 网站建设无锡海之睿文化馆互联网站建设方案
  • php网站作业模版正规的关键词优化软件
  • 仪征做网站阿里云域名注册查询
  • 有哪几个平台做网站情侣博客 wordpress
  • 360免费视频网站建设做本地的分类信息网站
  • 制作完整网站需要掌握哪些知识网站htm建设
  • 建设银行网站怎么登陆不了wordpress 菜单 无效
  • 一个域名能同时做2个网站吗怎么去推广自己的网站
  • 益阳学校网站建设wordpress插件 数据库
  • 泰安网站制作哪家好开一家软件外包公司
  • 教育网站模板传统网站设计的缺点
  • 江苏建设行政主管部门网站软件企业公司网站模板
  • 找别人做的网站问什么域名解析后还是上线不网站已运行时间代码
  • 连云港网站建设培训源创派网站建设