C中內(nèi)存管理與鏈表設(shè)置

在計(jì)算機(jī)中,數(shù)據(jù)與代碼沒(méi)有區(qū)別。

在標(biāo)準(zhǔn)C里,并沒(méi)有設(shè)置可以動(dòng)態(tài)添加的數(shù)組或者是其他的數(shù)據(jù)結(jié)構(gòu)。但是這門語(yǔ)言還是留了一條后路碼農(nóng)們,那就是void* malloc(int size);。 通過(guò)使用這個(gè)函數(shù), 碼農(nóng)們終于可以根據(jù)需求動(dòng)態(tài)的改變變量的數(shù)量。

C 的內(nèi)存結(jié)構(gòu)

事先聲明:這次的得到的結(jié)論是個(gè)人實(shí)驗(yàn)得出的結(jié)論,如有不對(duì)請(qǐng)務(wù)必糾正。

計(jì)算機(jī)架構(gòu)中,儲(chǔ)存器是一個(gè)十分重要的器件。在程序中定義的變量,在運(yùn)行時(shí)都會(huì)變成在內(nèi)存中的一個(gè)特定區(qū)塊。但是不同的語(yǔ)言會(huì)對(duì)變量的聲明和儲(chǔ)存有不同的規(guī)定。

Object  v;
v=new Object();

以上是在Java 中聲明并初始化一個(gè)Object型變量的過(guò)程。Object v; 這個(gè)語(yǔ)句其實(shí)是聲明了一個(gè)Object型的指針。v=new Object(); 讀取到這個(gè)語(yǔ)句時(shí), 系統(tǒng)會(huì)在內(nèi)存中創(chuàng)建一個(gè)區(qū)域作為v這個(gè)變量的儲(chǔ)存空間。在C中也有類似的步驟,但是有一點(diǎn)C卻不具備,那就是動(dòng)態(tài)生成。所謂動(dòng)態(tài)生成,是指在程序運(yùn)行的過(guò)程中,生成新的變量。但是C的初始化卻不具備這個(gè)功能,C的所有初始化都是靜態(tài)的,都是在編譯器里靜態(tài)規(guī)劃好了的。但是當(dāng)業(yè)務(wù)需要的時(shí)候,C 卻無(wú)法簡(jiǎn)單的實(shí)現(xiàn)動(dòng)態(tài)初始化。所以這需要碼農(nóng)在過(guò)程中自己實(shí)現(xiàn)這個(gè)過(guò)程。在C中,所有的變量所占的內(nèi)存早已在編譯完成的時(shí)候就規(guī)定好了。

typedef struct _sample{
int i;
}sample;

void main(){
      sample array[3];
      for(int i=0;i<3;i++){
            sample newUnit;
            newUnit.i=i;
            array[i]=newUnit;
      }
      for(int i=0;i<3;i++){
            printf("%d\n",array[i].i);
      }
}

      Output:
            0
            1
            2

在這段代碼中,看似好像有新生成的sample結(jié)構(gòu)體生成,但其實(shí)通過(guò)計(jì)算這段代碼生成的指針數(shù)量,可以發(fā)現(xiàn)數(shù)量并沒(méi)有增加,這就是為什么C無(wú)法簡(jiǎn)單的動(dòng)態(tài)生成變量。

C的鏈表設(shè)置

伸出你的手我和你,心連心

在上面的歌詞描述了鏈表的基礎(chǔ)結(jié)構(gòu)。而鏈表分為很多種,有單向,雙向,環(huán)形鏈表,每一種都有實(shí)際的用途。


20140222205732187.png

單向鏈表


20140223162747406.png

雙向鏈表
image.png

環(huán)形鏈表

當(dāng)需要一個(gè)可以動(dòng)態(tài)變更大小和各個(gè)元素位置的列表時(shí),這種結(jié)構(gòu)顯現(xiàn)其優(yōu)越性。那么問(wèn)題來(lái)了,應(yīng)該怎么樣實(shí)現(xiàn)的。實(shí)現(xiàn)的步驟是這樣的。


image.png

那廢話不多說(shuō),上代碼。

typedef struct _unit{
      struct _unit* last;
      int data;
      struct _unit* next;
}unit;

void main(){
      unit* head=malloc(sizeof(unit));
      head.last=NULL;
      head.data=0;
      head.next=NULL;
      unit* bufferNode;
      bufferNode=head;
      for(int i=0;i<10;i++){
            unit* node=malloc(sizeof(unit));;
            node.last=bufferNode;
            node.next=bufferNode.next;
            bufferNode.next=node;
            node.next->last=node;
            node.data=i+1;
      }
}

如果有興趣繼續(xù)了解的話,可以看看箱子寫的:
如何在沒(méi)有Malloc的情況下動(dòng)態(tài)管理內(nèi)存
如何在沒(méi)有Malloc的情況下動(dòng)態(tài)管理內(nèi)存 V2.0

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容