Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 24 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
24
Dung lượng
1,88 MB
Nội dung
Trường Đại học Khoa học Tự nhiên Khoa Công nghệ thơng tin Bộ mơn Tin học sở NHẬP MƠN LẬPĐặng TRÌNH Bình Phương dbphuong@fit.hcmuns.edu.vn QUẢN LÝ BỘ NHỚ && VC VC BB BB Nội dung Chuyển đổi kiểu (ép kiểu) Cấu trúc CT C nhớ Cấp phát nhớ động Các thao tác khối nhớ NMLT - Quản lý nhớ && VC VC BB BB Nhu cầu chuyển đổi kiểu Mọi đối tượng liệu C có kiểu xác định Biến có kiểu char, int, float, double, … Con trỏ trỏ đến kiểu char, int, float, double, … Xử lý gặp biểu thức với nhiều kiểu khác nhau? C tự động chuyển đổi kiểu (ép kiểu) Người sử dụng tự chuyển đổi kiểu NMLT - Quản lý nhớ && VC VC BB BB Chuyển đổi kiểu tự động Sự tăng cấp (kiểu liệu) biểu thức Các thành phần kiểu • Kết kiểu chung • Ví dụ: int / int int, float / float float Các thành phần khác kiểu • • • • Kết kiểu bao quát char < int < long < float < double Ví dụ: int / float float / float, … Lưu ý, chuyển đổi tạm thời (nội bộ) NMLT - Quản lý nhớ && VC VC BB BB Chuyển đổi kiểu tự động Phép gán = ; BT vế phải tăng cấp (hay giảm cấp) tạm thời cho giống kiểu với BT vế trái int i; float f = 1.23; i = f; f = i; // f tạm thời thành int // i tạm thời thành float Có thể làm tính xác số nguyên chuyển sang số thực hạn chế! int i = 3; float f; f = i; // f = 2.999995 NMLT - Quản lý nhớ && VC VC BB BB Chuyển đổi tường minh (ép kiểu) Ý nghĩa Chủ động chuyển đổi kiểu (tạm thời) nhằm tránh kết sai lầm Cú pháp () Ví dụ int x1 = float f1 float f2 float f3 1, x2 = 2; = x1 / x2; = (float)x1 / x2; = (float)(x1 / x2); // f1 = 0.0 // f2 = 0.5 // f3 = 0.0 NMLT - Quản lý nhớ && VC VC BB BB Cấp phát nhớ tĩnh động Cấp phát tĩnh (static memory allocation) Khai báo biến, cấu trúc, mảng, … Bắt buộc phải biết trước cần bao nhiều nhớ lưu trữ tốn nhớ, không thay đổi kích thước, … Cấp phát động (dynamic memory allocation) Cần cấp phát nhiêu Có thể giải phóng khơng cần sử dụng Sử dụng vùng nhớ ngồi chương trình (cả nhớ ảo virtual memory) NMLT - Quản lý nhớ && VC VC BB BB Cấu trúc CT C nhớ Toàn tập tin chương trình nạp vào nhớ vùng nhớ trống, gồm phần: STACK Last-In First-Out Lưu đối tượng cục Khi thực hàm Vùng nhớ trống HEAP Đối tượng tồn cục & tĩnh Mã chương trình Vùng cấp phát động (RAM trống nhớ ảo) Vùng cấp phát tĩnh (kích thước cố định) Gồm lệnh (kích thước cố định) NMLT - Quản lý nhớ && VC VC BB BB Cấp phát nhớ động Thuộc thư viện malloc calloc realloc free Trong C++ new delete NMLT - Quản lý nhớ && VC VC BB BB Cấp phát nhớ động void *malloc(size_t size) Cấp phát HEAP vùng nhớ size (bytes) size_t thay cho unsigned (trong ) Con trỏ đến vùng nhớ cấp phát NULL không đủ nhớ int *p = (int *)malloc(10*sizeof(int)); if (p == NULL) printf(“Không đủ nhớ! ”); NMLT - Quản lý nhớ && VC VC BB BB Cấp phát nhớ động void *calloc(size_t num, size_t size) Cấp phát vùng nhớ gồm num phần tử HEAP, phần tử kích thước size (bytes) Con trỏ đến vùng nhớ cấp phát NULL không đủ nhớ int *p = (int *)calloc(10, sizeof(int)); if (p == NULL) printf(“Không đủ nhớ! ”); NMLT - Quản lý nhớ && VC VC BB BB Cấp phát nhớ động void *realloc(void *block, size_t size) Cấp phát lại vùng nhớ có kích thước size block trỏ đến vùng nhớ HEAP block == NULL sử dụng malloc size == sử dụng free Con trỏ đến vùng nhớ cấp phát NULL không đủ nhớ int *p = (int *)malloc(10*sizeof(int)); p = (int *)realloc(p, 20*sizeof(int)); if (p == NULL) printf(“Không đủ nhớ! ”); NMLT - Quản lý nhớ && VC VC BB BB Cấp phát nhớ động void *free(void *ptr) Giải phóng vùng nhớ ptr trỏ đến, cấp hàm malloc(), calloc(), realloc() Nếu ptr NULL khơng làm Khơng có int *p = (int *)malloc(10*sizeof(int)); free(p); NMLT - Quản lý nhớ && VC VC BB BB Cấp phát nhớ động = new [size] Cấp phát vùng nhớ có kích thước sizeof()*size HEAP Con trỏ đến vùng nhớ cấp phát NULL không đủ nhớ int int int int *a1 = *a2 = *p1 = *p2 = (int *)malloc(sizeof(int)); new int; (int *)malloc(10*sizeof(int)); new int[10]; NMLT - Quản lý nhớ && VC VC BB BB Cấp phát nhớ động delete [] Giải phóng vùng nhớ HEAP trỏ đến (được cấp phát new) Không có! int *a = new int; delete a; int *p = new int[10]; delete []p; NMLT - Quản lý nhớ && VC VC BB BB Cấp phát nhớ động Lưu ý Không cần kiểm tra trỏ có NULL hay kơ trước free delete Cấp phát malloc, calloc hay realloc giải phóng free, cấp phát new giải phóng delete Cấp phát new giải phóng delete, cấp phát mảng new [] giải phóng delete [] NMLT - Quản lý nhớ && VC VC BB BB Thao tác khối nhớ Thuộc thư viện memset : gán giá trị cho tất byte nhớ khối memcpy : chép khối memmove : di chuyển thông tin từ khối sang khối khác NMLT - Quản lý nhớ && VC VC BB BB Thao tác khối nhớ void *memset(void *dest, int c, size_t count) Gán count (bytes) vùng nhớ mà dest trỏ tới giá trị c (từ đến 255) Thường dùng cho vùng nhớ kiểu char vùng nhớ kiểu khác thường đặt giá trị zero dest char buffer[] = “Hello world”; printf(“Trước memset: %s\n”, buffer); memset(buffer, ‘*’, strlen(buffer)); printf(“Sau memset: %s\n”, buffer); NMLT - Quản lý nhớ && VC VC BB BB Thao tác khối nhớ void *memcpy(void *dest, void *src, size_t count) Sao chép xác count byte từ khối nhớ src vào khối nhớ dest Nếu hai khối nhớ đè lên nhau, hàm làm việc khơng xác dest char src[] = “*****”; char dest[] = “0123456789”; memcpy(dest, src, 5); memcpy(dest + 3, dest + 2, 5); NMLT - Quản lý nhớ && VC VC BB BB Thao tác khối nhớ void *memmove(void *dest, void *src, size_t count) Sao chép xác count byte từ khối nhớ src vào khối nhớ dest Nếu hai khối nhớ đè lên nhau, hàm thực xác dest char src[] = “*****”; char dest[] = “0123456789”; memmove(dest, src, 5); memmove(dest + 3, dest + 2, 5); NMLT - Quản lý nhớ && VC VC BB BB Bài tập lý thuyết Bài 1: Tại cần phải giải phóng khối nhớ cấp phát động? Bài 2: Điều xảy ta thêm phần tử vào mảng cấp phát động trước mà khơng cấp lại nhớ? Bài 3: Ưu điểm việc sử dụng hàm thao tác khối nhớ? Ta sử dụng vòng lặp kết hợp với câu lệnh gán để khởi tạo hay chép byte nhớ hay không? NMLT - Quản lý nhớ && VC VC BB BB Bài tập lý thuyết Bài 4: Ta thường dùng phép ép kiểu trường hợp nào? Bài 5: Giả sử c kiểu char, i kiểu int, l kiểu long f kiểu float Hãy xác định kiểu biểu thức sau: (c + i + l) (i + 32) (c + ‘A’) (i + 32.0) (100 + 1.0) NMLT - Quản lý nhớ && VC VC BB BB Bài tập lý thuyết Bài 6: Việc cấp phát động nghĩa gì? Bài 7: Cho biết khác malloc() calloc()? Bài 8: Viết câu lệnh sử dụng hàm malloc() để cấp phát 1000 số kiểu long Bài 9: Giống dùng calloc() Bài 10: Cho biết khác memcpy memmove Bài 11: Trình bày cách khởi tạo mảng float data[1000]; với giá trị zero NMLT - Quản lý nhớ && VC VC BB BB Bài tập lý thuyết Bài 12: Kiểm tra lỗi void func() { int number1 = 100, number2 = 3; float answer; answer = number1 / number2; printf(“%d/%d=%f”, number1, number2, answer); } Bài 13: Kiểm tra lỗi void *p; p = (float *)malloc(sizeof(float)); *p = 1.23; NMLT - Quản lý nhớ