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

學無先后,達者為師

網站首頁 編程語言 正文

深入了解一下C語言中的柔性數組_C 語言

作者:Jambo! ? 更新時間: 2023-05-03 編程語言

什么是柔性數組

柔性數組是在C99中定義的

結構體的最后一個元素允許是未知大小的數組,這就叫柔性數組

柔性數組的長度可以寫成0,也可以不規定數組長度

下面兩種寫法都是正確的

struct S
{
int i;
int a[0];//柔性數組成員
}
struct S
{
int i;
int a[];//柔性數組成員
}
  • 結構體中的柔性數組成員前面至少有一個其他成員
  • sizeof返回的這種結構體的大小不包括柔性數組的大小
  • 包含柔性數組成員的結構體用malloc ()函數進行內存的動態分配,并且分配的內存應該大于結構的大
    小,以適應柔性數組的預期大小。

柔性數組的使用

typedef struct S
{
	int i;
	char c[];//c是柔性數組
}S;

int main()
{
	S* p = (S*)malloc(sizeof(S) + 10 * sizeof(char));
	if (p == NULL)
	{
		perror("malloc");
		return 1;
	}
	p->i = 10;
	for (int i = 0; i < 10; i++)
	{
		p->c[i] = 'a';
	}
	free(p);
	p = NULL;
	return 0;
}

在malloc開辟空間時,開辟空間大小為sizeof(S) + 10 * sizeof(char),前面的sizeof(S)其實是表示結構體中int i的大小,后面則是給c開辟了10個字節大小的連續空間

如果覺得前面開辟空間小了,數組c不夠長,還可以用realloc函數對內存大小進行調整

int main()
{
	S* p = (S*)malloc(sizeof(S) + 10 * sizeof(char));
	if (p == NULL)
	{
		perror("malloc");
		return 1;
	}
	p->i = 10;
	
	S* ptr = (S*)realloc(p, sizeof(S) + 20 * sizeof(char));
	if (ptr == NULL)
	{
		perror("realloc");
		return 1;
	}
	p = ptr;
	for (int i = 0; i < 20; i++)
	{
		p->c[i] = 'a';
	}

	free(p);
	p = NULL;
	return 0;
}

其實我們也可以寫出另一種形式的結構體,它的功能與柔性數組類似

typedef struct S2
{
    it i;
    char* c;
}S2;

對于這個結構體的使用如下:

int main()
{
	S2* p = (S2*)malloc(sizeof(S2));
	p->i = 10;
	p->c = (char*)malloc(10 * sizeof(char));
	for (int i = 0; i < 10; i++)
	{
		p->c[i] = 'a';
	}

	free(p->c);
	p->c = NULL;
	free(p);
	p = NULL;

	return 0;
}

為了使用這個結構體,需要先給結構體開辟一個空間S2* p = (S2*)malloc(sizeof(S2));然后再需要動態開辟一個塊空間讓c指向

這種寫法需要開辟2次內存,同樣在最后釋放內存是,也需要free2次

所以就可以看出柔性數組的好處:

第 一個是方便內存釋放

因為不論是我們在使用時或給別人寫一個函數讓別人使用時,如果在里面做了二次內存分配,可能別人使用時并不會知道結構體內部還有一個成員需要釋放。所以就需要把內存一次性分配好,在最后釋放一次內存就可以了

第二個是加快訪問

如果二次內存分配,就會在內存中產生一些內存碎片,這樣即浪費了空間也不利于訪問

原文鏈接:https://blog.csdn.net/weixin_64116522/article/details/128982081

欄目分類
最近更新