C语言从零开始——柔性数组

####   在结构体内如何存放动态长度字符串?   ####

/*

        如果需要在结构体里面存放一个动态长度的字符串,我们可以定义一个指针成员,
让指针指向字符串动态内存空间
        但是这样会造成结构体和字符串分离,操作起来十分麻烦      
        
        还有方法:定义一个结构体指针,将结构体和字符串直接链连接在一起。但是不赞
成这样做,因为表达起来很麻烦

*/

演示:编辑C代码,文件名:soft_arr_1.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct test1  //定义一个结构体
{
        int a;
        char b;
        char *p;
        struct test1 *p1;
}T;
int main(void)
{
        T t1;
        t1.p = "abc123"; //结构体内指针成员指向一个字符串地址;注意:此处的字符串在代码段
        printf("t1.p = %s \n",t1.p);

        char arr[] = "hello world"; //定义一个字符数组,在栈内
        printf("arr address = %p \n",arr);

        t1.p1 = (T *)malloc(sizeof(T) + strlen(arr) + 1); //使用malloc函数开辟空间为结构体

        strcpy((char *)(t1.p1 + 1) , arr); //将字符串复制给结构体内指针指向空间

        printf("arr = %s \n",t1.p1 + 1);
        return 0;
}

####   柔性数组   ####

/*
        柔性数组:结构体中最后一个成员是一个未知大小的数组
        要求:结构体里至少有两个元素,且最后一个元素是数组;
        该数组值作为一个符号地址存储,sizeof返回这种结构体大小时,不包括柔性数组
的内存。包含柔性数组的结构用malloc()函数进行内存的动态分配。非配的内存大小应该大
于结构的大小,以适应柔性数组的预期大小  
*/

演示:编辑C代码;文件名:soft_arr_2.c

#include <stdio.h>
#include <stdlib.h>

typedef struct test1
{
        int len;
        char arr[];
}T;

int main(void)
{
        int i = 0;
        T s;
        printf("sizeof(s) = %d \n",sizeof(s));//可以查看到,柔性数组不占内存大小

        T *p = (T *)malloc(sizeof(s) + sizeof(int)*10);//使用malloc函数为结构体>分配动态内存

        for (i=0;i<10;i++)//作为测试,给动态数组赋值
        {
                p->arr[i] = i;
        }
        for (i=0;i<10;i++)//作为测试,验证赋值结果
        {
                printf("p->arr[i] = %d \n",p->arr[i]);
        }
        return 0;
}

####   小程序熟悉体会掌握柔性数组   ####

/*
        斐波数列:1 1 2 3 5 8 13 21 34 55 ...
        要求:定义一个结构体,使用柔性数组,输出前n项斐波数列
*/

演示:编辑C代码;文件名:soft_arr_3.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct test1  //定义结构体,包含两个成员;与定义的长度,和柔性数组
{
        int len;
        int arr[];
}T;

T * get_mem(int len) //为结构体开辟堆内存空间
{
        T *p = (T *)malloc(sizeof(T)+sizeof(int)*len);
        if (NULL == p)
        {
                printf("apply mem failed !!!");
                return p;
        }
        memset(p,0,sizeof(T)+sizeof(int)*len); //内存清零
        p->len = len;//将结构体第一个成员赋值为数组长度大小
        return p;
}

void set_arr(T *p)
{
        int i = 0;
        for (i=0;i<p->len;i++)
        {
                if (i<=1)
                        p->arr[i] = 1;
                else
                        p->arr[i] = p->arr[i-1] + p->arr[i-2];
        }

}
void show_arr(T *p)
{
        int i = 0;
        for (i=0;i<p->len;i++)
        {
                printf("p->arr[%d] = [%u] \n",i,p->arr[i]);
        }
}

int main(void)
{
        int len;
        printf("how many you want show:\n");
        scanf("%d",&len);
        T *p =get_mem(len);
        set_arr(p);
        show_arr(p);
        return 0;
}
执行结果:

[root@localhost fsx_test_2]# gcc soft_arr_3.c
[root@localhost fsx_test_2]# ./a.out
how many you want show:
10
p->arr[0] = [1]
p->arr[1] = [1]
p->arr[2] = [2]
p->arr[3] = [3]
p->arr[4] = [5]
p->arr[5] = [8]
p->arr[6] = [13]
p->arr[7] = [21]
p->arr[8] = [34]
p->arr[9] = [55]


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值