Hàm resizeArray() trong C/C++
Sử dụng hàm resizeArray()
để thay đổi kích thước mảng. Hàm resizeArray()
cho phép cấp phát lại bộ nhớ cho mảng với kích thước mới mà ta mong muốn. Trong bài này, mình sẽ tìm hiểu chi tiết về cách sử dụng và triển khai hàm resizeArray() trong C/C++.
Cú pháp của hàm resizeArray() trong C/C++
Cú pháp tổng quát của hàm resizeArray()
void* resizeArray(void* array, size_t oldSize, size_t newSize, size_t elementSize);
Các tham số đầu vào của hàm resizeArray()
array
: Con trỏ đến mảng cần thay đổi kích thước.oldSize
: Kích thước hiện tại của mảng (tính bằng số phần tử).newSize
: Kích thước mới mong muốn của mảng (tính bằng số phần tử).elementSize
: Kích thước của mỗi phần tử trong mảng (tính bằng byte).
Giá trị trả về của hàm resizeArray()
- Hàm này không trả về giá trị nào (void). Mảng được cấp phát lại bộ nhớ với kích thước mới trực tiếp thông qua tham số con trỏ array.
Ví dụ
Giả sử mình có một mảng arr chứa các số nguyên và muốn thay đổi kích thước của nó từ 5 phần tử sang 10 phần tử. Dưới đây là cách triển khai của hàm resizeArray():
#include <stdio.h> #include <stdlib.h> // Hàm thay đổi kích thước của mảng void* resizeArray(void* array, size_t oldSize, size_t newSize, size_t elementSize) { // Cấp phát lại bộ nhớ cho mảng với kích thước mới void* newArray = malloc(newSize * elementSize); // Sao chép dữ liệu từ mảng cũ sang mảng mới size_t copySize = oldSize < newSize ? oldSize : newSize; memcpy(newArray, array, copySize * elementSize); // Giải phóng bộ nhớ của mảng cũ free(array); // Trả về con trỏ đến mảng mới return newArray; } //Bài viết này được đăng tại freetuts.net int main() { int* arr = malloc(5 * sizeof(int)); // Khởi tạo mảng với 5 phần tử // In mảng trước khi thay đổi kích thước printf("Mang truoc khi thay doi kich thuoc:\n"); for (int i = 0; i < 5; ++i) { arr[i] = i + 1; printf("%d ", arr[i]); } printf("\n"); // Thay đổi kích thước mảng thành 10 phần tử arr = resizeArray(arr, 5, 10, sizeof(int)); // In mảng sau khi thay đổi kích thước printf("Mang sau khi thay doi kich thuoc:\n"); for (int i = 0; i < 10; ++i) { printf("%d ", arr[i]); } printf("\n"); // Giải phóng bộ nhớ của mảng free(arr); //Bài viết này được đăng tại freetuts.net return 0; }
Output:
Mang truoc khi thay doi kich thuoc: 1 2 3 4 5 Mang sau khi thay doi kich thuoc: 1 2 3 4 5 0 0 0 0 0
Cách sử dụng hàm resizeArray() trong C/C++
Sử dụng hàm resizeArray() để thay đổi kích thước mảng một chiều
Giả sử mình có một mảng chứa các số nguyên và muốn thay đổi kích thước của nó từ 5 phần tử thành 10 phần tử. Dưới đây là cách sử dụng hàm resizeArray()
để thực hiện điều này:
#include <stdio.h> #include <stdlib.h> //Bài viết này được đăng tại freetuts.net // Hàm thay đổi kích thước của mảng void* resizeArray(void* array, size_t oldSize, size_t newSize, size_t elementSize) { // Cấp phát lại bộ nhớ cho mảng với kích thước mới void* newArray = malloc(newSize * elementSize); // Sao chép dữ liệu từ mảng cũ sang mảng mới size_t copySize = oldSize < newSize ? oldSize : newSize; memcpy(newArray, array, copySize * elementSize); // Giải phóng bộ nhớ của mảng cũ free(array); // Trả về con trỏ đến mảng mới return newArray; } int main() { int* arr = malloc(5 * sizeof(int)); // Khởi tạo mảng với 5 phần tử // In mảng trước khi thay đổi kích thước printf("Mang truoc khi thay doi kich thuoc:\n"); for (int i = 0; i < 5; ++i) { arr[i] = i + 1; printf("%d ", arr[i]); } printf("\n"); //Bài viết này được đăng tại freetuts.net // Thay đổi kích thước mảng thành 10 phần tử arr = resizeArray(arr, 5, 10, sizeof(int)); // In mảng sau khi thay đổi kích thước printf("Mang sau khi thay doi kich thuoc:\n"); for (int i = 0; i < 10; ++i) { printf("%d ", arr[i]); } printf("\n"); // Giải phóng bộ nhớ của mảng free(arr); return 0; }
Output:
Mang truoc khi thay doi kich thuoc: 1 2 3 4 5 Mang sau khi thay doi kich thuoc: 1 2 3 4 5 0 0 0 0 0
Sử dụng hàm resizeArray() để thay đổi kích thước mảng hai chiều
Giả sử mình có một mảng hai chiều (ma trận) và muốn thay đổi kích thước của nó từ 3x3 thành 4x4. Dưới đây là cách sử dụng hàm resizeArray()
để thực hiện điều này:
#include <stdio.h> #include <stdlib.h> //Bài viết này được đăng tại freetuts.net // Hàm thay đổi kích thước của mảng void** resizeArray(void** array, size_t oldRows, size_t oldCols, size_t newRows, size_t newCols, size_t elementSize) { // Cấp phát lại bộ nhớ cho mảng với kích thước mới void** newArray = malloc(newRows * sizeof(void*)); for (size_t i = 0; i < newRows; ++i) { newArray[i] = malloc(newCols * elementSize); } // Sao chép dữ liệu từ mảng cũ sang mảng mới for (size_t i = 0; i < newRows && i < oldRows; ++i) { memcpy(newArray[i], array[i], oldCols * elementSize); } // Giải phóng bộ nhớ của mảng cũ for (size_t i = 0; i < oldRows; ++i) { free(array[i]); } free(array); // Trả về con trỏ đến mảng mới return newArray; } //Bài viết này được đăng tại freetuts.net int main() { int** matrix = malloc(3 * sizeof(int*)); // Khởi tạo mảng 2 chiều 3x3 for (int i = 0; i < 3; ++i) { matrix[i] = malloc(3 * sizeof(int)); } // In ma trận trước khi thay đổi kích thước printf("Ma tran truoc khi thay doi kich thuoc:\n"); for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { matrix[i][j] = i * 3 + j + 1; printf("%d ", matrix[i][j]); } printf("\n"); } printf("\n"); // Thay đổi kích thước ma trận thành 4x4 matrix = resizeArray((void**)matrix, 3, 3, 4, 4, sizeof(int)); // In ma trận sau khi thay đổi kích thước printf("Ma tran sau khi thay doi kich thuoc:\n"); for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { printf("%d ", matrix[i][j]); } printf("\n"); } printf("\n"); //Bài viết này được đăng tại freetuts.net // Giải phóng bộ nhớ của ma trận for (int i = 0; i < 4; ++i) { free(matrix[i]); } free(matrix); return 0; }
Output:
Ma tran truoc khi thay doi kich thuoc: 1 2 3 4 5 6 7 8 9 Ma tran sau khi thay doi kich thuoc: 1 2 3 0 4 5 6 0 7 8 9 0 0 0 0 0
Lưu ý khi sử dụng hàm resizeArray() trong C/C++
Xử lý các trường hợp đặc biệt
- Thay đổi kích thước mảng rỗng: Nếu mảng truyền vào hàm resizeArray() là một con trỏ NULL, cần xử lý trường hợp này một cách cẩn thận để tránh lỗi segmentation fault. Có thể kiểm tra trước khi thực hiện thao tác thay đổi kích thước.
- Mảng chứa dữ liệu không liên tục: Nếu dữ liệu trong mảng không liên tục trong bộ nhớ, việc thay đổi kích thước có thể gây ra mất dữ liệu hoặc lỗi segmentation fault. Trong trường hợp này, cần kiểm tra cẩn thận và xử lý sao cho dữ liệu được giữ nguyên.
- Xử lý trường hợp kích thước mới nhỏ hơn kích thước cũ: Nếu kích thước mới nhỏ hơn kích thước cũ, cần đảm bảo rằng dữ liệu không bị mất đi khi thực hiện thay đổi kích thước.
Hạn chế của hàm resizeArray()
- Không kiểm tra các tham số đầu vào: Hàm resizeArray() không kiểm tra tính hợp lệ của các tham số đầu vào như con trỏ NULL hay kích thước âm, điều này có thể dẫn đến lỗi khi chạy chương trình nếu không được sử dụng đúng cách.
- Yêu cầu cẩn thận khi sử dụng với kiểu dữ liệu phức tạp: Nếu sử dụng hàm resizeArray() với các kiểu dữ liệu phức tạp (ví dụ: struct), cần đảm bảo rằng việc sao chép dữ liệu và giải phóng bộ nhớ được thực hiện đúng cách để tránh rò rỉ bộ nhớ hoặc mất dữ liệu.
Ví dụ về sử dụng hàm resizeArray() trong C/C++
Sử dụng hàm resizeArray() để thay đổi kích thước mảng trong các thuật toán sắp xếp
- Trong các thuật toán sắp xếp như Quick Sort, Merge Sort, hoặc Heap Sort, việc sử dụng mảng đôi khi yêu cầu kích thước có thể thay đổi trong quá trình thực thi. Hàm
resizeArray()
có thể được sử dụng để điều chỉnh kích thước của mảng trong quá trình thực hiện thuật toán.
#include <iostream> // Hàm resizeArray() để thay đổi kích thước mảng void resizeArray(int*& arr, int oldSize, int newSize) { int* newArr = new int[newSize]; for (int i = 0; i < oldSize && i < newSize; ++i) { newArr[i] = arr[i]; } delete[] arr; arr = newArr; } //Bài viết này được đăng tại freetuts.net // Thuật toán sắp xếp Quick Sort void quickSort(int* arr, int left, int right) { if (left < right) { int pivot = arr[left]; int i = left, j = right; while (i < j) { while (i < j && arr[j] >= pivot) j--; if (i < j) arr[i++] = arr[j]; while (i < j && arr[i] < pivot) i++; if (i < j) arr[j--] = arr[i]; } arr[i] = pivot; quickSort(arr, left, i - 1); quickSort(arr, i + 1, right); } } //Bài viết này được đăng tại freetuts.net int main() { int* arr = new int[5]{3, 7, 2, 1, 9}; int oldSize = 5; int newSize = 10; std::cout << "Original Array: "; for (int i = 0; i < oldSize; ++i) { std::cout << arr[i] << " "; } std::cout << std::endl; resizeArray(arr, oldSize, newSize); std::cout << "Resized Array: "; for (int i = 0; i < newSize; ++i) { std::cout << arr[i] << " "; } std::cout << std::endl; delete[] arr; return 0; }
Output:
Original Array: 3 7 2 1 9 Resized Array: 3 7 2 1 9 0 0 0 0 0
Áp dụng hàm resizeArray() để điều chỉnh kích thước mảng dựa trên yêu cầu của người dùng
- Trong ứng dụng thực tế, có thể cần thay đổi kích thước mảng dựa trên yêu cầu của người dùng, ví dụ: trong quá trình nhập liệu hoặc xử lý dữ liệu động. Hàm
resizeArray()
có thể được sử dụng để đáp ứng nhu cầu này.
#include <iostream> // Hàm resizeArray() để thay đổi kích thước mảng void resizeArray(int*& arr, int oldSize, int newSize) { int* newArr = new int[newSize]; for (int i = 0; i < oldSize && i < newSize; ++i) { newArr[i] = arr[i]; } delete[] arr; arr = newArr; } //Bài viết này được đăng tại freetuts.net int main() { int* arr = new int[5]{1, 2, 3, 4, 5}; int oldSize = 5; int newSize; std::cout << "Enter new size of the array: "; std::cin >> newSize; resizeArray(arr, oldSize, newSize); std::cout << "Resized Array with new size " << newSize << ": "; for (int i = 0; i < newSize; ++i) { std::cout << arr[i] << " "; } std::cout << std::endl; delete[] arr; return 0; }
Kết bài
Trong bài viết này, mình đã tìm hiểu về hàm resizeArray()
trong C/C++.Mình đã tìm hiểu cú pháp của hàm, cách sử dụng và các ví dụ minh họa cụ thể. Hàm resizeArray()
có thể được áp dụng trong nhiều tình huống khác nhau, từ việc thay đổi kích thước mảng trong các thuật toán sắp xếp đến việc điều chỉnh kích thước mảng dựa trên yêu cầu của người dùng.
Việc hiểu và biết cách sử dụng hàm này sẽ giúp cho việc xử lý mảng trở nên linh hoạt và dễ dàng hơn trong các dự án thực tế. Nhớ rằng, khi sử dụng hàm này, cần phải xử lý các trường hợp đặc biệt và hạn chế của nó để đảm bảo tính ổn định và hiệu quả của mã.
Bài giải
-------------------- ######## --------------------
Câu hỏi thường gặp liên quan:
- Hàm initializeArray() trong C/C++
- Hàm resizeArray() trong C/C++
- Hàm transposeMatrix() trong C/C++
- Hàm multiplyMatrices() trong C/C++
- Hàm sumOfArrayElements() trong C/C++
- Hàm averageOfArrayElements() trong C/C++
- Hàm countOccurrences() trong C/C++
- Hàm sortArray() trong C/C++
- Hàm findSumOfRows() trong C/C++
- Hàm findSumOfColumns() trong C/C++
- Hàm isSymmetricMatrix() trong C/C++