日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C語言中的柔性數組你真的了解嗎_C 語言

作者:誠摯的喬治 ? 更新時間: 2022-04-21 編程語言

柔性數組概念:

柔性數組就是一種特殊的數組

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

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

特點:

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訪問內存大部分在訪問一個空間后,就會訪問相鄰的空間,就不一次性訪問下一個連續的空間,這就會導致,在一定程度上的降速。?

總結

原文鏈接:https://blog.csdn.net/m0_64332179/article/details/122953630

欄目分類
最近更新