梓益C語言學習筆記之鏈表&動態記憶體&檔案

來源:互聯網
上載者:User

標籤:C語言   鏈表   

梓益C語言學習筆記之鏈表&動態記憶體&檔案

一、定義:

鏈表是一種實體儲存體上非連續,通過指標連結次序,實現的一種線性儲存結構。

二、特點:

鏈表由一系列節點(鏈表中每一個元素稱為節點)組成,節點在運行時動態產生(malloc),每個節點包括兩個部分:

儲存資料元素的資料域

儲存下一個節點地址的指標域

如:

  typedef struct student

 {  

int num;

char name[20];

struct student *next;

    }STU;

三、動態記憶體申請

在實際的編程中,有時所需的記憶體空間取決於實際輸入的資料,無法預先確定 ,所以需要動態分配記憶體空間,同時把不再使用的空間回收再次利用。

如鏈表的記憶體就需要動態申請


1.靜態分配&動態分配

靜態分配

在程式編譯或運行過程中,按事先規定大小分配記憶體空間的分配方式。如:int a [10]

必須事Crowdsourced Security Testing道所需空間的大小。

分配在棧區或全域變數區,一般以數組的形式。

按計劃分配。

動態分配

在程式運行過程中,根據需要大小自由分配所需空間。

按需分配。

分配在堆區,一般使用特定的函數進行分配。

通常使用malloc函數     void *malloc(unsigned int size);   在堆區分配一塊長度為size位元組的連續地區,用來存放類型說明符指定的類型。

函數返回void*指標,使用時必須做相應的強制類型轉換 

分配的記憶體空間內容不確定,一般使用memset初始化。

使用完以後,要記得用  free()函數  釋放記憶體 

傳回值:分配空間的起始地址 ( 分配成功 )

 NULL                          ( 分配失敗 )

注意

1、在調用malloc之後,一定要判斷一下,是否申請記憶體成功。

2、如果多次malloc申請的記憶體,第1次和第2次申請的記憶體不一定是連續的

例:

#include<stdlib.h>

#include<stdio.h>

#include<string.h>

int main()

{

int count,*array,n;

printf("請輸入您要申請的數組元素個數\n");

scanf("%d",&n);

array=(int *)malloc(n*sizeof(int));

if(array==NULL)

{

printf("申請記憶體失敗\n");

return 0;

}

memset(array,0,n*sizeof(int));

for(count=0;count<n;count++)

{

array[count]=count;

}

for(count=0;count<n;count++)

{

printf("%d\n",array[count]);

}


free(array);//釋放array指向的記憶體


return0

}

free 函數(釋放記憶體函數)

標頭檔:#include<stdlib.h>

函數定義:void free(void *ptr)

函數說明:free函數釋放ptr指向的記憶體。

例:

char *p=(char *)malloc(100);

free(p);// 

注意

1、free後,因為沒有給p賦值,所以p還是指向原先動態申請的記憶體。但是記憶體已經不能再用了,p變成野指標了。

2、一塊動態申請的記憶體只能free一次,不能多次free


四、檔案

檔案就是存放在磁碟上的,一些資料的集合。

1.行緩衝:

標準io庫函數,往標準輸出(螢幕)輸出東西的時候是行緩衝的

 行緩衝只有下面幾種情況才重新整理緩衝區

 1-緩衝區裡有分行符號  "\n"

2-緩衝區滿了,自動重新整理緩衝區

如:while(1)

{

printf("hello world ");

}

3-人為重新整理緩衝區 fflush(stdout)

4-程式正常結束,重新整理緩衝區return 0;


2.全緩衝:

標準io庫函數 往普通檔案讀寫資料是全緩衝的,

碰到分行符號也不重新整理緩衝區

1.緩衝區滿了,重新整理緩衝區

2.人為重新整理緩衝區 fflush(檔案指標)

3.程式正常結束重新整理緩衝區

3.無緩衝:

在讀寫檔案的時候通過系統調用io (read write),對檔案進行讀寫資料是無緩衝的,即寫資料會立馬進入檔案,讀資料會立馬進入記憶體


4.寫檔案的流程:

應用程式空間-(核心空間 -(驅動程式--(硬碟

應用程式和核心程式運行在不同的空間裡,目的是為了保護核心。

通過緩衝可以減少進出核心的次數,以提高效率。


5.熱門檔案操作:

5.1開啟檔案:FILE *fopen(const char *path, const char *mode);

FILE *fp;

fp=fopen(“./test.txt”,”r”);

5.2關閉檔案:int fclose(FILE *fp);

例:

#include<stdio.h>

int main()

{

FILE *fp;

int ret;

fp=fopen("./test.txt","r+");

if(fp==NULL)

{

perror(“fopen”);

return 0;

}

fclose(fp);

return 0;

}


5.3檔案定位:

rewind 複位讀寫位置

把檔案內部的位置指標移到檔案首 

rewind(fp);


ftell 測檔案讀寫位置距檔案開始有多少個位元組

 int length;   length = ftell(fp); 


fseek 定位位置指標(讀寫位置)

fseek函數(一般用於二進位檔案即開啟檔案的方式需要帶b)

int fseek(FILE *stream, long offset, int whence);  //int fseek(檔案類型指標,位移量,起始點); 

參數:

whence起始位置 

檔案開頭         SEEK_SET     0

檔案當前位置     SEEK_CUR     1

檔案末尾         SEEK_END     2

offset位移量:

以起始點為基點,向前、後移動的位元組數,正數往檔案末尾方向位移,負數往檔案開頭方向位移。

例:

fseek(fp,50,SEEK_SET)

fseek(fp,-50,SEEK_END);

fseek(fp,0,SEEK_END);


梓益C語言學習筆記之鏈表&動態記憶體&檔案

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.