在計(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í)際的用途。

單向鏈表

雙向鏈表

環(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)的步驟是這樣的。

那廢話不多說(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