目录
  • 柔性数组概念:
  • 特点:
  • 与指针动态开辟的比较
    • 指针动态开辟
    • 柔性数组
    • 指针动态开辟的缺点
  • 总结

    柔性数组概念:

    柔性数组就是一种特殊的数组

    它也是结构体最后一个成员

    也就是说,它存在结构体最后一个成员的位置上

    特点:

    1.柔性数组在结构体的大小是未知的,在sizeof中不计算其大小

    #include<stdio.h>
    struct S
    {
    	int n ;
    	int arr[0];//或者int arr[];
    };
    main()
    {
    	printf("The size of the structure is  %d",sizeof(struct S));
    	return 0;
    }

    C语言中的柔性数组你真的了解吗

    2.在结构体中,如果存在柔性数组,就必须满足它的前面含有其它的成员,来申请空间,,因为他的大小本身是未知的,不计算大小。

    3.包含柔性数组的结构体要靠malloc去动态申请这块空间,这就体现了柔性数组的柔,也就是可以控制大小,且分配的空间一定满足大于其它成员的大小。

    与指针动态开辟的比较

    在日常的编程中,有时候需要在结构体中存放一个长度动态的数组

    一般的做法,是在结构体中定义一个指针成员,这个指针成员指向该数组所在的动态内存空间

    指针动态开辟

    #include<stdio.h>
    struct S
    {
    	int n;
    	int* arr;
    };
     
    int main()
    {
    	struct S* ps = (struct S*)malloc(sizeof(struct S));
    	ps->n = 100;
    	ps->arr = (int*)malloc(40);
    	free(ps->arr);
    	ps->arr = NULL;
    	free(ps);
    	ps = NULL;
    	return 0;
    }

    C语言中的柔性数组你真的了解吗

    通过柔性数组来实现如下:

    柔性数组

    #include<stdio.h>
    struct S
    {
    	int n;
    	int arr[0];//柔性数组
    };
    int main()
    {
    	struct S* ps = (struct S*)malloc(sizeof(struct S)+40);
    	//使用
    	//改变申请的空间
    	struct S* tmp= (struct S*)realloc(ps, sizeof(struct S)+80);
    	if (tmp == NULL)
    	{
    		return;
    	}
    	if (tmp != NULL)
    	{
    		ps = tmp;
    	}
    	return 0;
    }

     

    C语言中的柔性数组你真的了解吗

    指针动态开辟的缺点

    1.此方式会多次进行开辟于释放动态申请的空间,就容易会导致错误

    2.容易出现内存碎片

    当指针动态开辟的足够多的时候,中间就会出现很多内存碎片,每个内存碎片不连续

    就会导致空间的浪费

    C语言中的柔性数组你真的了解吗

    3.相较于柔性数组,CPU访问的速度要慢一些

    CPU访问内存大部分在访问一个空间后,就会访问相邻的空间,就不一次性访问下一个连续的空间,这就会导致,在一定程度上的降速。 

    C语言中的柔性数组你真的了解吗

    总结

    本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注的更多内容! 

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。