1. Trang chủ
  2. » Công Nghệ Thông Tin

NHẬP MÔN LẬP TRINH Quản Ly Bộ Nhớ

24 63 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

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ớ

Ngày đăng: 08/02/2020, 10:50

w