C中,在struct中,得到一个可变大小的数组

本文通过一个具体的C语言示例程序展示了如何使用动态内存分配来为结构体成员字符串分配足够的空间,并实现字符串复制及打印功能。
#include  < stdio.h >

struct  xx{
        
int  i;
        
char  st[ 1 ];
};

int  main()
{
    
char  s1[] = " abc " ;
    
struct  xx  * a = ( struct  xx * )malloc( sizeof ( struct  xx) + strlen(s1) + 1 );
    strcpy(a
-> st, s1);
    printf(
" %s " , a -> st);
    free(a);
    getch();
    
return   0 ;
}

详细内容见《深度探索C++对象模型》P19

 http://community.youkuaiyun.com/Expert/topic/5054/5054882.xml?temp=.9214289

在Linux内核编程中,可变长度数组的实现通常依赖于零长度数组(zero-length array)或变长数组(Variable Length Arrays,VLA)的特性。这两种技术在内核中被广泛用于处理动态长度的数据结构。以下是几种常见方法及其实现方式: ### 使用零长度数组获取可变长度数组的大小 零长度数组通常作为结构体的最后一个成员,允许结构体在分配内存时动态扩展。这种技术在Linux内核中被广泛用于表示变长数据结构,例如网络协议中的数据包头和数据负载。 例如,一个典型的结构体定义如下: ```c struct my_struct { int length; char data[0]; // 零长度数组 }; ``` 在分配内存时,可以根据需要动态扩展 `data` 数组的大小: ```c struct my_struct *s = kmalloc(sizeof(struct my_struct) + desired_size, GFP_KERNEL); s->length = desired_size; ``` 在这种情况下,`length` 字段通常用于记录 `data` 数组的实际大小。通过访问 `s->length` 即可获取可变长度数组的大小[^4]。 ### 使用变长数组(VLA)获取数组大小 在支持C99标准的编译器中,可以使用变长数组(VLA)来定义运行时确定大小的数组。例如: ```c void example_function(int size) { int array[size]; // ... } ``` 在这种情况下,可以通过 `sizeof(array) / sizeof(array[0])` 来获取数组的大小: ```c int array_size = sizeof(array) / sizeof(array[0]); ``` 需要注意的是,VLA 的大小必须在运行时确定,并且其生命周期仅限于当前作用域。在内核编程中,由于栈空间有限,通常不推荐使用 VLA 来分配较大的数组,以避免栈溢出的问题[^1]。 ### 使用 `flex_array` 接口管理动态数组 Linux 内核还提供了一个名为 `flex_array` 的接口,用于管理动态数组。`flex_array` 提供了灵活的数组操作函数,允许动态调整数组的大小。使用 `flex_array` 的步骤如下: 1. 分配 `flex_array` 结构体: ```c struct flex_array *fa = flex_array_alloc(element_size, total_elements, GFP_KERNEL); ``` 2. 设置数组大小: ```c flex_array_set_capacity(fa, new_capacity); ``` 3. 获取数组大小: ```c int capacity = flex_array_capacity(fa); ``` 通过 `flex_array_capacity` 函数可以获取当前数组的容量。需要注意的是,`flex_array` 的底层实现基于分页机制,适用于管理大量数据的情况[^4]。 ### 使用 `kmalloc_array` 和 `kfree` 管理动态数组 在某些情况下,可以直接使用 `kmalloc_array` 来分配动态数组: ```c int *array = kmalloc_array(num_elements, sizeof(int), GFP_KERNEL); ``` 在这种情况下,可以通过 `num_elements` 变量来记录数组的大小。由于 `kmalloc_array` 不会存储数组的大小信息,因此需要开发者自行维护该信息。 ### 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值