使struct对象拥有可变大小的数组——(C++深度探索)
2023-09-11 14:16:38 时间
首先摘录《Inside The C++ Object Model》中的一段话:
把单一元素的数组放在一个struct的尾端,于是每个 struct objects 可以拥有可变大小的数组:
struct mumble {
char pc[1];
};
//获取一个字符串,然后为struct本身和该字符串配置足够的内存
struct mumble *pmumbl = (struct mumble*)malloc(sizeof(struct
mumble) + strlen(string) + 1);
strcpy(pmumbl->pc, string);
书上已经说得很明白,但个人理解的时候开始还是出了点问题,错误地认为 mumble 对象的 pc 成员在栈上,以为 strcpy 操作造成数组溢出而覆盖了后续内存。
实际上对象指针pmumbl所指的内存全部位于堆上,如下图所示:
指针 pmumbl 指向的是 malloc 所分配的整个内存,而 pmumbl->pc 指向的是这块内存的第一个字节,因为 malloc 操作为整个 string 分配了足够的内存,所以在 strcpy 时,虽然溢出了 pc 的内存范围,但没有溢出 struct 的内存范围,使得 strcpy 的结果是合理的和可控的。这样一来,相当于 struct 拥有了可变大小的数组,更加灵活。
相关文章
- C++对象模型
- 站在巨人的肩膀上,C++开源库大全
- C++ map 用法
- C++ 对象数组
- C++ 内存管理
- C++语言 对象数组 友元函数
- c# 传递Null的string值导致的调用C++的dll报错 Attempted to read or write protected memory.
- 19 C++ - 类和对象的基本概念
- C++STL之动态数组vector
- C++ 链接Mysql 函数介绍
- C++ 类和对象
- C++ 指针
- 《易学C++(第2版)》——1.10 习题
- 《C++多线程编程实战》——1.3 程序结构、执行流和运行时对象
- 《C++多线程编程实战》——2.5 进程间通信(IPC)
- 《C++面向对象高效编程(第2版)》——2.16 识别成员函数的目标对象
- 《C++面向对象高效编程(第2版)》——3.18 客户对类和函数的责任
- 《C++ Templates中文版》——第1章 关于本书
- 基本概念(6)——一些c++库和框架
- 《c++语言导学》——2.6 建议
- 将C++对象暴露给QML
- C++:函数名后加const
- C/C++ | C语言字符数组初始化,有些赋值方式千万注意
- C++函数返回局部变量
- 一个用C++写的Json解析与处理库
- C++ | 探究拷贝对象时的一些编译器优化
- C/C++获取本地时间常见方法
- Effective C++ Item 38 通过复合塑模出 has-a 或 is-implemented-in-terms-of
- C/C++教程 第八章 —— 制作爬虫