QC

Quản lý bộ nhớ trong lập trình C

 


Ngôn ngữ lập trình C cung cấp một số hàm để cấp phát và quản lý bộ nhớ. Các hàm này được cài đặt trong tệp tiêu đề <stdlib.h>.

HàmMô tả
malloc()Phân bổ kích thước yêu cầu của byte và trả về một byte đầu tiên của không gian được phân bổ.
calloc()Phân bổ không gian cho một phần tử mảng, khởi tạo về 0 và sau đó trả về một con trỏ tới bộ nhớ.
free()Giải phóng không gian được phân bổ trước đó.
realloc()Thay đổi kích thước của không gian được phân bổ trước đó.

bộ nhớ động

Trong khi lập trình, nếu bạn nhận thức được kích thước của một mảng, bài toán trở lên đơn giản và bạn có thể định nghĩa nó như một mảng. Ví dụ, để lưu trữ danh sách tên, với kích thước tối đa là 20ký tự, bạn có thể định nghĩa như sau:

char name[100];

Nhưng bây giờ chúng ta hãy xem xét một tình huống mà bạn không biết về độ dài của văn bản bạn cần để lưu trữ, ví dụ, bạn muốn lưu trữ một mô tả chi tiết về một chủ đề. Ở đây chúng ta cần định nghĩa một con trỏ tới ký tự mà không cần định nghĩa bao nhiêu bộ nhớ được yêu cầu và sau đó, dựa trên yêu cầu, chúng ta có thể cấp phát bộ nhớ như trong ví dụ dưới đây:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main() {
 
   char name[100];
   char *description;
 
   strcpy(name, "anh");
 
   /* phan bo bo nho dong */
   description = malloc( 200 * sizeof(char) );
  
   if( description == NULL ) {
      fprintf(stderr, "Error - khong the phan bo bo nho yeu cau.\n");
   } else {
      strcpy( description, "Vinh la mot ky su dien tu.");
   }
    
   printf("Name = %s\n", name );
   printf("Description: %s\n", description );
}


Kết quả:

Name = anh
Description: Vinh la mot ky su dien tu.

Ta cũng có thể sử dụng calloc(); để cấp phát bộ nhớ động, với cú pháp như sau:

description = calloc( 200 * sizeof(char) );


Thay đổi kích thước và giải phóng bộ nhớ 

    Khi chương trình của bạn kết thúc, hệ điều hành sẽ tự động giải phóng tất cả bộ nhớ do chương trình của bạn phân phối nhưng như nó sẽ tốt hơn khi không cần bộ nhớ nữa thì bạn nên giải phóng bộ nhớ đó bằng cách gọi hàm free().

    Ngoài ra, bạn có thể tăng hoặc giảm kích thước của khối bộ nhớ được cấp phát bằng cách gọi hàm realloc(). Ví dụ sau sử dụng các hàm realloc() và free()


#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char name[100]; char *description; strcpy(name, "Anh"); // phan bo bo nho dong cho description description = malloc( 50 * sizeof(char) ); if( description == NULL ) { fprintf(stderr, "Error - khong the phan bo bo nho yeu cau.\n"); } else { strcpy( description, "Vinh la mot ky su dien tu."); } printf("Name = %s\n", name ); printf("Description: %s\n", description ); // thay doi kich thuoc bo nho cua description description = realloc( description, 100 * sizeof(char) ); if( description == NULL ) { fprintf(stderr, "Error - khong the phan bo bo nho yeu cau.\n"); } else { strcat( description, "Anh la mot ky su DIEN TU," " hien tai dang lam viec cho cong ty ABC"); } printf("Description: %s\n", description ); // giai phong bo nho free(description); }

Kết quả :

Name = Anh

Description: Vinh la mot ky su dien tu.

Description: Anh la mot ky su dien tu.Vinh la mot ky su DIEN TU, hien tai dang lam viec cho cong ty ABC









Nap Code vào PY32F003 dùng Stlink

 Nap Code vào PY32F003 dùng Stlink Bước 1: Cài đặt  KeilC v5.39 theo link sau ( chú ý 5.39 keil c mới nạp ok). https://edge07.111.ir.cdn.ir/...