首頁 > 軟體

C語言中的柔性陣列你真的瞭解嗎

2022-02-16 19:00:54

柔性陣列概念:

柔性陣列就是一種特殊的陣列

它也是結構體最後一個成員

也就是說,它存在結構體最後一個成員的位置上

特點:

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;
}

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;
}

通過柔性陣列來實現如下:

柔性陣列

#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;
}

 

指標動態開闢的缺點

1.此方式會多次進行開闢於釋放動態申請的空間,就容易會導致錯誤

2.容易出現記憶體碎片

當指標動態開闢的足夠多的時候,中間就會出現很多記憶體碎片,每個記憶體碎片不連續

就會導致空間的浪費

3.相較於柔性陣列,CPU存取的速度要慢一些

CPU存取記憶體大部分在存取一個空間後,就會存取相鄰的空間,就不一次性存取下一個連續的空間,這就會導致,在一定程度上的降速。 

總結

本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容! 


IT145.com E-mail:sddin#qq.com