欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言編程C++柔性數(shù)組結(jié)構(gòu)示例講解

 更新時間:2021年09月28日 09:00:59   作者:小碼農(nóng)UU  
這篇文章主要介紹了C語言編程系列中的柔性數(shù)組,文中含有詳細的示例代碼講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助

繞指柔—柔性數(shù)組

也許你從來沒有聽說過柔性數(shù)組(flexible array)這個概念,但是它確實是存在的。 C99 中,結(jié)構(gòu)體中的最后一個元素允許是未知大小的數(shù)組,這就叫做柔性數(shù)組成員。

柔性數(shù)組的特點:

1.結(jié)構(gòu)中的柔性數(shù)組成員前面必須至少一個其他成員。

2.sizeof 返回的這種結(jié)構(gòu)大小不包括柔性數(shù)組的內(nèi)存。

image-20210922062118298

3.包含柔性數(shù)組成員的結(jié)構(gòu)用malloc ()函數(shù)進行內(nèi)存的動態(tài)分配,并且分配的內(nèi)存應該大于結(jié)構(gòu)的大小,以適應柔性數(shù)組的預期大小

image-20210922063451309

那我們?nèi)绾问褂媚?/p>

image-20210925215752477

法一

#include<stdio.h>
#include<stdlib.h>
struct S
{
	int a;
	int arr[];//未知大小 柔性數(shù)組成員  數(shù)組的大小是可以調(diào)整的
};
int main()
{
	//我們怎么開辟呢
	//包含柔性數(shù)組成員的結(jié)構(gòu)體的使用,要配合malloc這樣的動態(tài)內(nèi)存分配內(nèi)存函數(shù)使用
	struct S* ps = (struct S*)malloc(sizeof(struct S) + 5 * sizeof(int));
	//我們?nèi)绾问褂媚?
	ps->a = 100;
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		ps->arr[i] = i;
	}
	//還想擴大呢
	struct S* ptr = (struct S*)realloc(ps, sizeof(struct S) + 10 * sizeof(int));//先交給ptr,防止內(nèi)存調(diào)整失敗
	if (ptr == NULL)//判斷是否開辟成功
	{
		printf("擴容失敗\n");
		return 0;
	}
	else
	{
		ps = ptr;
		for (int i = 5; i < 10; i++)
		{
			ps->arr[i] = i;
		}
		for (int i = 0; i < 10; i++)
		{
			printf("%d ", ps->arr[i] = i);
		}
		//用完就釋放
		free(ps);
		ps = NULL;
	}	
	return 0;
}

法二

image-20210922071448537

image-20210925223935303

#include<stdio.h>
#include<stdlib.h>
struct S
{
	int a;
	int* parr;
};
int main()
{
	//我們怎么開辟呢
	struct S* ps = (struct S*)malloc(sizeof(struct S));
	//我們?nèi)绾问褂媚?
	ps->a = 100;
	ps->parr = (int*)malloc(5 * sizeof(int));
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		ps->parr[i] = i;
	}
	//還想擴大呢
	int* ptr = (int*)malloc(10 * sizeof(int));//先交給ptr,防止內(nèi)存調(diào)整失敗
	if (ptr == NULL)//判斷是否開辟成功
	{
		printf("擴容失敗\n");
		return 0;
	}
	else
	{
		ps->parr = ptr;
		for (int i = 5; i < 10; i++)
		{
			ps->parr[i] = i;
		}
		for (int i = 0; i < 10; i++)
		{
			printf("%d ", ps->parr[i] = i);
		}
		//用完就釋放
		free(ps->parr);
		ps->parr = NULL;
		free(ps);
		ps = NULL;
	}	
	return 0;
}

那上面那個方法好一點呢

第一個好處是:方便內(nèi)存釋放

如果我們的代碼是在一個給別人用的函數(shù)中,你在里面做了二次內(nèi)存分配,并把整個結(jié)構(gòu)體返回給用戶。用戶調(diào)用free可以釋放結(jié)構(gòu)體,但是用戶并不知道這個結(jié)構(gòu)體內(nèi)的成員也需要free,所以你不能指望用戶來發(fā)現(xiàn)這個事。所以,如果我們把結(jié)構(gòu)體的內(nèi)存以及其成員要的內(nèi)存一次性分配好了,并返回給用戶一個結(jié)構(gòu)體指針,用戶做一次free就可以把所有的內(nèi)存也給釋放掉。

第二個好處是:這樣有利于訪問速度

連續(xù)的內(nèi)存有益于提高訪問速度,也有益于減少內(nèi)存碎片。(其實,我個人覺得也沒多高了,反正你跑不了要用做偏移量的加法來尋址)

總結(jié)

第一種好,不好的話,要柔性數(shù)組干嗎?是不是
何意百煉剛,化為繞指柔

首先說明一下我不軟弱,只是單純覺得這句詩好玩,我不認為這首詩是軟弱的詩我有自己的見解。說軟弱的只能說不要你想的就是你想的。

以上就是C語言編程之柔性數(shù)組示例講解的詳細內(nèi)容,更多關(guān)于C語言柔性數(shù)組的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語言實現(xiàn)快速排序改進版

    C語言實現(xiàn)快速排序改進版

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)快速排序的改進代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • C++11右值引用和std::move語句實例解析(推薦)

    C++11右值引用和std::move語句實例解析(推薦)

    右值引用(及其支持的Move語意和完美轉(zhuǎn)發(fā))是C++0x將要加入的最重大語言特性之一。這篇文章主要介紹了C++11右值引用和std::move語句實例解析,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-03-03
  • C語言全面細致精講操作符的使用

    C語言全面細致精講操作符的使用

    C?語言提供了豐富的操作符,有:算術(shù)操作符,移位操作符,位操作符,賦值操作符,單目操作符,關(guān)系操作符,邏輯操作符,條件操作符等。接下了讓我們詳細了解掌握它
    2022-05-05
  • linux c語言操作數(shù)據(jù)庫(連接sqlite數(shù)據(jù)庫)

    linux c語言操作數(shù)據(jù)庫(連接sqlite數(shù)據(jù)庫)

    linux下c語言操作sqlite數(shù)據(jù)庫實例方法,大家參考使用吧
    2013-12-12
  • C語言實現(xiàn)通訊錄系統(tǒng)

    C語言實現(xiàn)通訊錄系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)通訊錄系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • 用C++面向?qū)ο蟮姆绞絼討B(tài)加載so的方法

    用C++面向?qū)ο蟮姆绞絼討B(tài)加載so的方法

    下面小編就為大家?guī)硪黄肅++面向?qū)ο蟮姆绞絼討B(tài)加載so的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • 淺析C++中cout的運行機制

    淺析C++中cout的運行機制

    關(guān)于C++中cout的使用,相信大家再熟悉不過了,然而對于cout是如何輸出的?輸出的機制是啥,需要進一步的了解。本章娓娓道來。前幾天在網(wǎng)上看到這么一個題目
    2013-10-10
  • Windows安裝配置C/C++(VS2017)OpenSSL開發(fā)環(huán)境配置教程

    Windows安裝配置C/C++(VS2017)OpenSSL開發(fā)環(huán)境配置教程

    這篇文章主要為大家詳細介紹了Windows安裝配置C/C++,OpenSSL開發(fā)環(huán)境配置教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • c語言簡單實現(xiàn)文件 r/w 操作方法

    c語言簡單實現(xiàn)文件 r/w 操作方法

    由于在 C 語言中 '\' 一般是轉(zhuǎn)義字符的起始標志,故在路徑中需要用兩個 '\' 表示路徑中目錄層次的間隔,也可以使用 '/' 作為路徑中的分隔符,本文重點給大家介紹用c語言簡單實現(xiàn)文件 r/w 操作方法,感興趣的朋友一起學習吧
    2021-05-05
  • C++實現(xiàn)雙向鏈表代碼分析

    C++實現(xiàn)雙向鏈表代碼分析

    這篇文章主要介紹了C++實現(xiàn)雙向鏈表代碼分析,前面文章分析了單向鏈表,這篇文章就來給大家分享雙鏈表的實現(xiàn)吧,需要的朋友可以參考一下
    2022-03-03

最新評論