Menu
×

Được chứng nhận

Ghi lại kiến ​​thức của bạn

Đăng nhập Đăng ký

Tạo Tài khoản Example.com.vn miễn phí để cải thiện trải nghiệm học tập của bạn

Người tìm đường và việc học của tôi

Theo dõi tiến độ học tập của bạn tại Example.com.vn và thu thập phần thưởng

Nâng cấp

Trở thành người dùng PLUS và mở khóa các tính năng mạnh mẽ (không có quảng cáo, lưu trữ, hỗ trợ, ..)

Bắt đầu từ đâu

Bạn không chắc chắn muốn bắt đầu từ đâu? Đi theo con đường được hướng dẫn của chúng tôi

Trình chỉnh sửa mã (Dùng thử)

Với trình chỉnh sửa mã trực tuyến của chúng tôi, bạn có thể chỉnh sửa mã và xem kết quả trong trình duyệt của mình

Video

Tìm hiểu những điều cơ bản về HTML qua video hướng dẫn thú vị và hấp dẫn

Mẫu

Chúng tôi đã tạo một loạt mẫu trang web đáp ứng mà bạn có thể sử dụng - miễn phí!

Web hosting

Lưu trữ trang web của riêng bạn và chia sẻ nó với mọi người với Example.com.vn Spaces

Tạo một máy chủ

Tạo máy chủ của riêng bạn bằng Python, PHP, React.js, Node.js, Java, C#, v.v.

Làm thế nào để

Bộ sưu tập lớn các đoạn mã cho HTML, CSS và JavaScript

Khung CSS

Xây dựng các trang web nhanh và phản hồi bằng cách sử dụng khung W3.CSS miễn phí của chúng tôi

Thống kê trình duyệt

Đọc xu hướng dài hạn của việc sử dụng trình duyệt

Tốc độ gõ

Kiểm tra tốc độ đánh máy của bạn

Đào tạo AWS

Tìm hiểu dịch vụ web của Amazon

Bộ chọn màu

Sử dụng công cụ chọn màu của chúng tôi để tìm các màu RGB, HEX và HSL khác nhau. Bánh xe màu hình tròn thể hiện sự chuyển màu trong quang phổ

Trò chơi mã

Trò chơi mã hóa W3Schools! Giúp linh miêu thu thập nón thông Logo Lynx

Đặt mục tiêu

Nhận hành trình học tập được cá nhân hóa dựa trên các kỹ năng và mục tiêu hiện tại của bạn

Bản tin

Tham gia bản tin của chúng tôi và có quyền truy cập vào nội dung độc quyền mỗi tháng

Việc làm

Thuê những tài năng công nghệ hàng đầu. Hợp lý hóa quy trình tuyển dụng của bạn để có đội ngũ phù hợp hoàn hảo

Lớp học

Hãy liên hệ để sử dụng Example.com.vn Plus và các chứng chỉ với tư cách là một tổ chức giáo dục

×
HTML CSS JAVASCRIPT SQL PYTHON JAVA PHP CÁCH W3.CSS C C++ C# BOOTSTRAP REACT MYSQL JQUERY EXCEL XML DJANGO NUMPY PANDAS NODEJS R TYPESCRIPT ANGULAR GIT POSTGRESQL MONGODB ASP AI GO KOTLIN SASS VUE DSA GEN AI SCIPY AWS AN NINH MẠNG DỮ LIỆU KHOA HỌC

Ví dụ về quản lý bộ nhớ C


Ví dụ về quản lý bộ nhớ thực tế

Để minh họa một ví dụ thực tế về bộ nhớ động , chúng tôi đã tạo một chương trình có thể tạo một danh sách có độ dài bất kỳ.

Các mảng thông thường trong C có độ dài cố định và không thể thay đổi, nhưng với bộ nhớ động chúng ta có thể tạo danh sách bao lâu tùy thích:

Ví dụ

struct list {
  int *data; // Points to the memory where the list items are stored
  int numItems; // Indicates how many items are currently in the list
  int size; // Indicates how many items fit in the allocated memory
};

void addToList(struct list *myList, int item);

int main() {
  struct list myList;
  int amount;

  // Create a list and start with enough space for 10 items
  myList.numItems = 0;
  myList.size = 10;
  myList.data = malloc(myList.size * sizeof(int));

  // Find out if memory allocation was successful
  if (myList.data == NULL) {
    printf("Memory allocation failed");
    return 1; // Exit the program with an error code
  }

  // Add any number of items to the list specified by the amount variable
  amount = 44;
  for (int i = 0; i < amount; i++) {
    addToList(&myList, i + 1);
  }

  // Display the contents of the list
  for (int j = 0; j < myList.numItems; j++) {
    printf("%d ", myList.data[j]);
  }

  // Free the memory when it is no longer needed
  free(myList.data);
  myList.data = NULL;

  return 0;
}

// This function adds an item to a list
void addToList(struct list *myList, int item) {

  // If the list is full then resize the memory to fit 10 more items
  if (myList->numItems == myList->size) {
    myList->size += 10;
    myList->data = realloc( myList->data, myList->size * sizeof(int) );
  }

  // Add the item to the end of the list
  myList->data[myList->numItems] = item;
  myList->numItems++;
}
Hãy tự mình thử »

Con trỏ tới cấu trúc: Ví dụ này có một con trỏ tới cấu trúc myList . Vì chúng ta đang sử dụng một con trỏ tới cấu trúc thay vì chính cấu trúc đó nên chúng ta sử dụng cú pháp mũi tên ( -> ) để truy cập các thành viên của cấu trúc.

Ví dụ giải thích

Ví dụ này có ba phần:

  • Cấu trúc myList chứa dữ liệu của danh sách
  • Hàm main() có chương trình trong đó.
  • Hàm addToList() để thêm một mục vào danh sách

Cấu trúc myList

Cấu trúc myList chứa tất cả thông tin về danh sách, bao gồm cả nội dung của nó. Nó có ba thành viên:

  • data - Một con trỏ tới bộ nhớ động chứa nội dung của danh sách
  • numItems - Cho biết số lượng mục mà danh sách có
  • size - Cho biết có bao nhiêu mục có thể vừa trong bộ nhớ được phân bổ

Chúng tôi sử dụng một cấu trúc để có thể dễ dàng chuyển tất cả thông tin này vào một hàm.

Hàm main()

Hàm main() bắt đầu bằng cách khởi tạo danh sách có khoảng trống cho 10 mục:

// Create a list and start with enough space for 10 items
myList.numItems = 0;
myList.size = 10;
myList.data = malloc(myList.size * sizeof(int));

myList.numItems được đặt thành 0 vì danh sách bắt đầu trống.

myList.size theo dõi lượng bộ nhớ được dành riêng. Chúng tôi đặt nó thành 10 vì chúng tôi sẽ dành đủ bộ nhớ cho 10 mục.

Sau đó, chúng tôi phân bổ bộ nhớ và lưu trữ một con trỏ tới nó trong myList.data .

Sau đó, chúng tôi bao gồm việc kiểm tra lỗi để tìm hiểu xem việc cấp phát bộ nhớ có thành công hay không:

// Find out if memory allocation was successful
if (myList.data == NULL) {
  printf("Memory allocation failed");
  return 1; // Exit the program with an error code
}

Nếu mọi thứ đều ổn, một vòng lặp sẽ thêm 44 mục vào danh sách bằng hàm addToList() :

// Add any number of items to the list specified by the amount variable
amount = 44;
for (int i = 0; i < amount; i++) {
  addToList(&myList, i + 1);
}

Trong đoạn mã trên, &myList là một con trỏ tới danh sách và i + 1 là số mà chúng ta muốn thêm vào danh sách. Chúng tôi đã chọn i + 1 để danh sách bắt đầu từ 1 thay vì 0. Bạn có thể chọn bất kỳ số nào để thêm vào danh sách.

Sau khi tất cả các mục đã được thêm vào danh sách, vòng lặp tiếp theo sẽ in nội dung của danh sách.

// Display the contents of the list
for (int j = 0; j < myList.numItems; j++) {
  printf("%d ", myList.data[j]);
}

Khi in xong danh sách, chúng tôi sẽ giải phóng bộ nhớ để tránh rò rỉ bộ nhớ.

// Free the memory when it is no longer needed
free(myList.data);
myList.data = NULL;

Hàm addToList()

Hàm addToList() của chúng ta thêm một mục vào danh sách. Phải mất hai tham số:

void addToList(struct list *myList, int item)
  1. Một con trỏ tới danh sách.
  2. Giá trị được thêm vào danh sách.

Trước tiên, hàm này sẽ kiểm tra xem danh sách đã đầy hay chưa bằng cách so sánh số mục trong danh sách với kích thước của danh sách. Nếu danh sách đầy thì nó sẽ phân bổ lại bộ nhớ để chứa thêm 10 mục:

// If the list is full then resize the memory to fit 10 more items
if (myList->numItems == myList->size) {
  myList->size += 10;
  myList->data = realloc( myList->data, myList->size * sizeof(int) );
}

Cuối cùng, hàm thêm mục vào cuối danh sách. Chỉ mục tại myList->numItems luôn ở cuối danh sách vì nó tăng thêm 1 mỗi khi có một mục mới được thêm vào.

// Add the item to the end of the list
myList->data[myList->numItems] = item;
myList->numItems++;

Tại sao chúng tôi đặt trước 10 mặt hàng cùng một lúc?

Tối ưu hóa là hành động cân bằng giữa bộ nhớ và hiệu suất. Mặc dù chúng ta có thể đang cấp phát một số bộ nhớ mà chúng ta không sử dụng nhưng việc tái cấp phát bộ nhớ quá thường xuyên có thể không hiệu quả. Có sự cân bằng giữa việc cấp phát quá nhiều bộ nhớ và cấp phát bộ nhớ quá thường xuyên.

Chúng tôi đã chọn số 10 cho ví dụ này nhưng nó phụ thuộc vào lượng dữ liệu bạn mong đợi và tần suất thay đổi. Ví dụ: nếu chúng ta biết trước rằng chúng ta sẽ có chính xác 44 mục thì chúng ta có thể cấp phát bộ nhớ cho chính xác 44 mục và chỉ cấp phát một lần.



×

Liên hệ bán hàng

Nếu bạn muốn sử dụng dịch vụ của Example.com.vn với tư cách là một tổ chức giáo dục, nhóm hoặc doanh nghiệp, hãy gửi email cho chúng tôi:
[email được bảo vệ]

Báo cáo lỗi

Nếu bạn muốn báo cáo lỗi hoặc nếu bạn muốn đưa ra đề xuất, hãy gửi email cho chúng tôi:
[email được bảo vệ]

Example.com.vn được tối ưu hóa cho việc học tập và đào tạo. Các ví dụ có thể được đơn giản hóa để cải thiện khả năng đọc và học. Các hướng dẫn, tài liệu tham khảo và ví dụ liên tục được xem xét để tránh sai sót, nhưng chúng tôi không thể đảm bảo tính chính xác hoàn toàn của mọi nội dung. Khi sử dụng W3Schools, bạn đồng ý đã đọc và chấp nhận các điều khoản sử dụng , chính sách cookie và quyền riêng tư của chúng tôi.

Bản quyền 1999-2024 của Refsnes Data. Đã đăng ký Bản quyền. Example.com.vn được cung cấp bởi W3.CSS .