CÁC HÀM C / C++
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

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ã.

test php

Bài giải

-------------------- ######## --------------------

Câu hỏi thường gặp liên quan:

Cùng chuyên mục:

Các hàm xử lý ngày tháng (datetime.h) trong C/C++

Các hàm xử lý ngày tháng (datetime.h) trong C/C++

Các hàm xử lý số thực (float.h) trong C/C++

Các hàm xử lý số thực (float.h) trong C/C++

Các hàm xử lý số nguyên lớn (bigint.h) trong C/C++

Các hàm xử lý số nguyên lớn (bigint.h) trong C/C++

Các hàm xử lý thời gian (time.h) trong C

Các hàm xử lý thời gian (time.h) trong C

Các hàm xử lý chuỗi (string.h) trong C/C++

Các hàm xử lý chuỗi (string.h) trong C/C++

Thread Pools và Parallel Algorithms trong C++

Thread Pools và Parallel Algorithms trong C++

Tạo và quản lý các Multithreading trong C++

Tạo và quản lý các Multithreading trong C++

Xử lý ngoại lệ khi làm việc với Memory Allocation trong C++

Xử lý ngoại lệ khi làm việc với Memory Allocation trong C++

Try, Catch, và Throw của Exception Handling trong C++

Try, Catch, và Throw của Exception Handling trong C++

Cách sử dụng Lambda Expressions trong C++

Cách sử dụng Lambda Expressions trong C++

Sử dụng weak_ptr trong C++

Sử dụng weak_ptr trong C++

Sử dụng shared_ptr trong C++

Sử dụng shared_ptr trong C++

Sử dụng unique_ptr trong C++

Sử dụng unique_ptr trong C++

Tổng quan về Smart Pointers trong C++

Tổng quan về Smart Pointers trong C++

Sử dụng Iterators trong STL của C++

Sử dụng Iterators trong STL của C++

[Iterator] Sử dụng Vector trong C++

[Iterator] Sử dụng Vector trong C++

[Iterator] Sử dụng trong List trong C++

[Iterator] Sử dụng trong List trong C++

[STL] Sử dụng Vector trong C++

[STL] Sử dụng Vector trong C++

Tổng quan về Iterators trong C++

Tổng quan về Iterators trong C++

[STL] Các hàm thường dùng của lớp Vector trong C++

[STL] Các hàm thường dùng của lớp Vector trong C++

Top