Con Tro - Cap Phat - Giai Phong - P2

2
Con tr---------- CÁC CƠ CHCP PHÁT VÀ GII PHÓNG --------- Trong lp trình C có 3 cơ chế cp phát( 3 hàm ) + malloc(<sbyte cn cp phát cho toàn chương trình>) + calloc(<slượng ô cn cp phát>,<Độ ln ca 1 ô>) + realloc => có 2 dng 1/.Đối vi vùng nhchưa được khi to thì realloc có chc năng to mi vùng nhcho nó. 2/.Đối vi vùng nhcó sn thì realloc có chc năng gia tăng/ gim bt ô nhớ => gii phóng: free Trong lp trình C++ + new ( không phi là hàm, mà là toán t) => gii phóng: delete --------- Ti sao cn gii phóng con tr------------ => Bn cht ca vic gii phóng là nó báo cho chương trình biết là vùng nhnày nè, nó không còn sdng na.Hđiu hành có thsdng nó vào mt tiến trình khác => Nếu như ngay khi ta khai báo gii phóng mà có 1 tiến trình khác chiếm hu ô nhđó => giá trhin ti trên ô nhđó skhông còn na, còn nếu không có tiến trình nào chiếm hu => giá trhin ti trên ô nhv•n còn. - Nếu như không gii phóng thì nhng ô nhđó không bao gi được gii phóng => đến 1 lúc nào đó sxy ra tình trng tràn bnh(memory leak)=> đứng máy. - Đề bài: Nhp vào 2 snguyên a, b.Tìm Min & Max ca 2 sđó , dùng con trLàm theo C: #include <stdlib.h> //Hàm nhn 2 tham slà 2 con tr, trv1 giá trlà Min int TimMin(int *a, int *b) // Hàm trvgiá tr{ return *a < *b ? *a : *b; } //Hàm nhn 2 tham slà 2 con tr, trv1 con trcha giá trln nht int* TimMax(int *a, int *b) // Hàm trvcon tr{ return *a > *b ? a : b; } // Cách 2: Viết 1 hàm cp phát , không cn ghi cp phát trong main na void CapPhatCach1(int *&x) // dùng tham chiếu { x = (int *)malloc(sizeof(int *)); //x = (int *)calloc(1, sizeof(int *)); //x = (int *)realloc(0,sizeof(int *)); } void CapPhatCach2(int **x) // đ°y lên 1 mc cao hơn (con trcp 2) { *x = (int *)malloc(sizeof(int *)); // *x = (int *)calloc(1, sizeof(int *)); // *x = (int *)realloc(0,sizeof(int *)); } int main() { int *a, *b;

Transcript of Con Tro - Cap Phat - Giai Phong - P2

 

Con trỏ---------- CÁC CƠ CHẾ CẤP PHÁT VÀ GIẢI PHÓNG ---------Trong lập trình C có 3 cơ chế cấp phát( 3 hàm )+ malloc(<số byte cần cấp phát cho toàn chương trình>)+ calloc(<số lượng ô cần cấp phát>,<Độ lớn của 1 ô>)+ realloc => có 2 dạng

1/.Đối với vùng nhớ chưa được khởi tạo thì realloc cóchức năng tạo mới vùng nhớ cho nó.2/.Đối với vùng nhớ có sẵn thì realloc có chức nănggia tăng/ giảm bớt ô nhớ 

=> giải phóng: free

Trong lập trình C+++ new ( không phải là hàm, mà là toán tử)=> giải phóng: delete--------- Tại sao cần giải phóng con trỏ ------------=> Bản chất của việc giải phóng là nó báo cho chương trình biếtlà vùng nhớ này nè, nó không còn sử dụng nữa.Hệ điều hành có thể sửdụng nó vào một tiến trình khác => Nếu như ngay khi ta khai báo giải phóngmà có 1 tiến trình khác chiếm hữu ô nhớ đó => giá trị hiện tại trên ô nhớđó sẽ không còn nữa, còn nếu không có tiến trình nào chiếm hữu => giátrị hiện tại trên ô nhớ v•n còn.

- Nếu như không giải phóng thì những ô nhớ đó không bao gi được giải phóng=> đến 1 lúc nào đó sẽ xảy ra tình trạng tràn bộ nhớ (memory leak)=> đứng máy.

- Đề bài: Nhập vào 2 số nguyên a, b.Tìm Min & Max của 2 số đó , dùng con trỏ

Làm theo C:#include <stdlib.h>//Hàm nhận 2 tham số là 2 con trỏ , trả về 1 giá trị là Minint TimMin(int *a, int *b) // Hàm trả về giá trị{

return *a < *b ? *a : *b;}

//Hàm nhận 2 tham số là 2 con trỏ, trả về 1 con trỏ chứa giá trị lớn nhấtint* TimMax(int *a, int *b) // Hàm trả về con trỏ{

return *a > *b ? a : b;}

// Cách 2: Viết 1 hàm cấp phát , không cần ghi cấp phát trong main nữavoid CapPhatCach1(int *&x) // dùng tham chiếu{

x = (int *)malloc(sizeof(int *));//x = (int *)calloc(1, sizeof(int *));//x = (int *)realloc(0,sizeof(int *));

}

void CapPhatCach2(int **x) // đ°y lên 1 mức cao hơn (con trỏ cấp 2){

*x = (int *)malloc(sizeof(int *));// *x = (int *)calloc(1, sizeof(int *));// *x = (int *)realloc(0,sizeof(int *));

}int main(){

int *a, *b;

 

CapPhatCach1(a);CapPhatCach1(b);

//CapPhatCach2(&a);//CapPhatCach2(&b);

//a = (int *)malloc(sizeof(int *)); // a = (int *)calloc(1, sizeof(int *));

  // a = (int *)realloc(0, sizeof(int *));

//b = (int *)malloc(sizeof(int *));// b = (int *)calloc(1, sizeof(int *));

 // b = (int *)realloc(0, sizeof(int *));

printf("\nNhap a = ");scanf("%d", a) // con trỏ vốn là địa ch² r³i => ko cần dấu &printf("\nNhap b = ");scanf("%d", b);

int Min = TimMin(a, b);int *Max = TimMax(a, b);//cách 2: int Max = *TimMax(a, b);

printf("\nMin = %d & Max = %d", Min , *Max);

free(a);free(b);getch();return 0;

}