包含零长度数组的结构体申请内存

本文详细解析了在C语言中如何为包含零长度数组的结构体分配内存,使用宏struct_size计算结构体总大小,结合具体实例展示了如何通过kmalloc函数申请所需内存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面的结构体中包含了一个零长度的数组
struct ib_pkey_cache {
	int             table_len;
	u16             table[0];
};
那如果要定义一个这个结构体的指针的话,申请的空间改怎么计算呢?
可以参看下面的code
struct ib_pkey_cache      *pkey_cache = NULL;
pkey_cache = kmalloc(struct_size(pkey_cache, table, tprops->pkey_tbl_len),
			     GFP_KERNEL);
	if (!pkey_cache)
		goto err;
这段code 用tprops->pkey_tbl_len 来表示要给原本零长度数组分配的空间,然后用
struct_size来计算整个结构体的长度。
其中struct_size 是一个宏,实现如下:
#define struct_size(p, member, n)					\
	__ab_c_size(n,							\
		    sizeof(*(p)->member) + __must_be_array((p)->member),\
		    sizeof(*(p)))

 

### C++ 中使用动态数组作为结构体成员的方法 在C++中,如果希望将动态数组作为结构体的成员,则需要特别注意内存管理。由于静态分配的数组大小固定,在编译期就必须确定其尺寸;而动态数组则允许程序运行期间根据实际需求调整大小。 为了实现这一点,通常会在结构体内存储指向动态分配数组的指针,并提供相应的构造函数来初始化该指针以及析构函数释放资源[^2]。下面是一个具体的例子: ```cpp #include <iostream> using namespace std; // 定义一个包含动态数组结构体 struct DynamicArrayStruct { int size; double* data; // 存储动态数组的指针 // 构造函数用于初始化动态数组 DynamicArrayStruct(int sz) : size(sz), data(new double[size]) {} // 析构函数负责清理动态分配的空间 ~DynamicArrayStruct() { delete[] data; } void setElement(int index, double value){ if(index >= 0 && index < size){ data[index] = value; } } double getElement(int index)const{ if (index >= 0 && index < size) return data[index]; else throw out_of_range("Index out of bounds"); } }; int main(){ const int SIZE = 5; // 创建结构体实例并传入所需大小 DynamicArrayStruct das(SIZE); // 设置一些元素值 for(int i=0;i<SIZE;++i){ das.setElement(i,i*i); } // 输出这些元素值 for(int j=0;j<SIZE;++j){ cout << "das.data["<<j<<"]="<<das.getElement(j)<<endl; } } ``` 此代码片段展示了如何定义带有动态数组成员的`DynamicArrayStruct`结构体,其中包括了一个整型变量`size`表示数组长度和一个双精度浮点数类型的指针`data`用来保存动态分配后的地址。此外还实现了两个辅助方法:`setElement()`设置指定索引处的数值,`getElement()`获取对应位置上的数值。最后通过主函数演示了创建对象、赋值及打印的过程[^3]。 #### 注意事项 当处理涉及动态内存分配的情况时,务必确保正确地管理好生命周期内的每一个阶段——即从申请空间直到最终回收为止都应保持严谨的态度以免造成内存泄漏等问题的发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值