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