在計算機中嘁灯,數據與代碼沒有區(qū)別。
在標準C里靶病,并沒有設置可以動態(tài)添加的數組或者是其他的數據結構会通。但是這門語言還是留了一條后路碼農們,那就是void* malloc(int size);
娄周。 通過使用這個函數涕侈, 碼農們終于可以根據需求動態(tài)的改變變量的數量。
C 的內存結構
事先聲明:這次的得到的結論是個人實驗得出的結論煤辨,如有不對請務必糾正裳涛。
計算機架構中,儲存器是一個十分重要的器件众辨。在程序中定義的變量端三,在運行時都會變成在內存中的一個特定區(qū)塊。但是不同的語言會對變量的聲明和儲存有不同的規(guī)定泻轰。
Object v;
v=new Object();
以上是在Java 中聲明并初始化一個Object型變量的過程技肩。Object v;
這個語句其實是聲明了一個Object型的指針。v=new Object();
讀取到這個語句時浮声, 系統會在內存中創(chuàng)建一個區(qū)域作為v這個變量的儲存空間虚婿。在C中也有類似的步驟,但是有一點C卻不具備泳挥,那就是動態(tài)生成然痊。所謂動態(tài)生成,是指在程序運行的過程中屉符,生成新的變量剧浸。但是C的初始化卻不具備這個功能,C的所有初始化都是靜態(tài)的矗钟,都是在編譯器里靜態(tài)規(guī)劃好了的唆香。但是當業(yè)務需要的時候,C 卻無法簡單的實現動態(tài)初始化吨艇。所以這需要碼農在過程中自己實現這個過程躬它。在C中,所有的變量所占的內存早已在編譯完成的時候就規(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結構體生成,但其實通過計算這段代碼生成的指針數量疮跑,可以發(fā)現數量并沒有增加组贺,這就是為什么C無法簡單的動態(tài)生成變量。
C的鏈表設置
伸出你的手我和你,心連心
在上面的歌詞描述了鏈表的基礎結構祖娘。而鏈表分為很多種失尖,有單向,雙向渐苏,環(huán)形鏈表掀潮,每一種都有實際的用途。
單向鏈表
雙向鏈表
環(huán)形鏈表
當需要一個可以動態(tài)變更大小和各個元素位置的列表時整以,這種結構顯現其優(yōu)越性胧辽。那么問題來了,應該怎么樣實現的公黑。實現的步驟是這樣的邑商。
那廢話不多說,上代碼凡蚜。
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ù)了解的話人断,可以看看箱子寫的:
如何在沒有Malloc的情況下動態(tài)管理內存
如何在沒有Malloc的情況下動態(tài)管理內存 V2.0