Con Tro - Cap Phat - Giai Phong - P2
-
Upload
ngoc-vuquoc -
Category
Documents
-
view
220 -
download
0
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;
}