Tại sao mảng có thể thay đổi kích thước

theo em biết thì kích thước mảng là cố định kể từ khi khởi tạo xong. vậy tại sao khi thêm phần tử vào mảng lại có thể thay đổi kích thước vậy ạ?

Cần phân biệt giữa sức chứa của mảng và số phần tử trong mảng :slight_smile:

4 Likes

@rogp10

  • 2 cái này khác nhau chỗ nào vậy a?
  • khi khai báo a[n] sau dó ++n; là tăng sức chứa hay số phần tử vậy ạ?

Cả hai đều không đúng, a[n] đã cố định từ lúc khai báo rồi.

5 Likes

@rogp10 vậy bản chất của việc thêm phần tử vào mảng là gì vậy ạ?

Mảng từ khi khai báo thì không thay đổi được số lượng phần tử. Nên tất nhiên không thêm bớt được số phần tử.

Truy cập ra ngoài phạm vi mà không lỗi chẳng qua chỉ là hên xui khi việc thao tác đó chưa gây ra hậu quả.
Ví dụ xây nhà vượt vào đất nhà hàng xóm có thể chưa bị sao nhưng có thể bị kiện bất cứ lúc nào.

4 Likes
void chenPhanTu(int a[], int n, int k, int pos){
    ++n;
    for (int i = n-1; i > pos; i--)
    {
        a[i]=a[i-1];
    }
    a[pos]=k;   
}

@Duong_Act vậy cái ++n; là sai hả anh?

n này là số phần tử :smiley:@Duong_Act thì đang nói về sức chứa của mảng.

4 Likes

++n hay n++ là tăng chỉ số truy cập phần tử trong mảng. Không phải là thêm số phần tử.

4 Likes
#include <stdio.h>
void chenPhanTu(int a[], int n, int k, int pos){
    ++n;
    for (int i = n-1; i > pos; i--)
    {
        a[i]=a[i-1];
    }
    a[pos]=k;  
}

int main(){
    int n;
    scanf("%d", &n);
    int a[n];
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }

    chenPhanTu(a, n, 10, 2);

    for (int i = 0; i < n+1; i++)
    {
        printf("%d ", a[i] );
    }

    return 0;
}

@rogp10 @Duong_Act ví dụ như đoạn code trên thì sức chứa ban đầu chỉ có n. tại sao hàm chenPhanTu vẫn tăng sức chứa được thế hả anh?

Sức chứa không tăng. Nó chỉ dịch giá trị trong các phần tử của mảng sang các phần tử khác. Phần tử cuối cùng sẽ mất giá trị.

n của em chỉ là con số đưa từ ngoài vào để báo cho chương trình biết kích thước mảng đang thao tác. Thay đổi n không có nghĩa thay đổi số phần tử. n nó như cân nặng của em ghi trên giấy khám sức khoẻ. Thay đổi nó không làm em béo gầy thêm ::))

Bài của em giống việc em đang có 10 cái hộp ( mảng 10 phần tử). Trong mỗi hộp là 1 viên bi (giá trị của phần tử).
Bây giờ em đang dịch viên bi trong hộp này sang hộp kia để lấy chỗ bỏ thêm 1 viên bi khác vào 1 trong số các hộp đó. Sẽ có 1 viên bi bị bỏ ra ngoài mà số lượng hộp (sức chứa) vẫn vậy.

4 Likes

@Duong_Act

từ đoạn này thì trong n hộp, mỗi hộp đã có 1 viên bi rồi, làm sao mà chuyển bi sang hộp khác được nữa. nếu muốn thêm bi vào rõ ràng ta cần thêm 1 hộp nữa(tăng sức chứa) chứ anh?

vậy làm sao để biết sức chứa thực sự của mảng?

Đầu tiên phải bỏ 1 viên bi ra ra trước.
Nhìn thuật toán sẽ rõ. Nó duyệt từ cuối mảng duyệt lên và phần tử hiện tại sẽ lưu giá trị của phần tử ngay trước nó.

a[i] = a[i-1]

Như vậy giá trị (viên bi) của phần tử cuối cùng (hộp cuối) sẽ bị bỏ đi.

Muốn biết sức chứa của mảng thì dùng sizeof.

int cap = sizeof(mảng) / sizeof(phần tử).
// sizeof (mảng) trả về số byte mảng đang chiếm)
// sizeof (phần tử) trả về số byte của một phần tử
4 Likes

nếu ô nhớ cuối cùng của mảng nằm cạnh ô nhớ khác có giá trị thì giá trị cuối cùng của mảng có chèn lên ô nhớ bên cạnh đấy dẫn đến lỗi không ạ? @Duong_Act

Có một số trường hợp:

Ô nhớ cạnh đó chưa sử dụng thì thường không gây lỗi ngay lúc đó nhưng khi khi ô nhớ đó được sử dụng thì có thể gây lỗi.

Ô nhớ cạnh đó đang sử dụng nhưng được phép chỉnh sửa thì sẽ làm sai dữ liệu và làm các chương trình đang sử dụng chạy sai.

Ô nhớ đó có dữ liệu và được bảo vệ hoặc không cho phép sửa thì sẽ gây lỗi ngay lập tức.

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?