Tại sao khi sử dung giá trị của biến để khởi tạo cho một mảng lại xảy ra lỗi trong ngôn ngữ lập trình C?

Mình sử dụng biến hằng const int size = 5 làm giá trị để chỉ định cho kích thước của mảng, trước khi biên dịch mình nghĩ rằng nó sẽ chạy như bình thường. Nhưng khi biên dịch nó đã xảy ra lỗi:
error: variable-sized object may not be initialized

#include <stdio.h>
int main() {
    const int size = 5;
    int data[size] = {0, 1, 2, 3, 4};
    return 0;
}

Lỗi trên có thể dịch sang tiếng việt thành: Đối tượng với kích cỡ có thể biến đổi (variable-sized) có thể không được khởi tạo. Vì trình biên dịch cần biết kích cỡ của mảng là hằng số ở compile time.
Ở C biến const chỉ có nghĩa là biến read-only không thể được chỉnh sửa. Bạn có thể sửa thành #define size 5 hoặc khởi tạo mảng xong lần lượt gán giá trị vào.

4 Likes

Mình có thắc mắc rằng, biến size có giá trị hằng số là 5. Vậy thì giá trị của size sẽ là không đổi. Mình chưa hiểu rõ lắm, bạn có thể giải thích kĩ hơn không ? Mình thực sự cảm ơn bạn rất nhiều !

Cái này không liên quan biến size có phải là hằng số hay không. C có hỗ trợ khai báo mảng như vậy. Nếu bạn có thể đọc được đầy đủ thông báo lỗi (error: variable-sized object may not be initialized except with an empty initializer), thì bạn đã hiểu là tại sao rồi.

Nó bảo rằng bạn không thể khởi tạo mảng động như vậy được, mà chỉ có thể dùng khởi tạo “rỗng”. Nên cách giải quyết là:

  1. Hoặc là bạn dùng mảng tĩnh:
int data[] = {0, 1, 2, 3, 4};
  1. Hoặc bạn dùng vòng lặp/memcpy:
int size = 5;
int data[size];
const int init_data[] = {0, 1, 2, 3, 4};
memcpy(data, init_data, sizeof(init_data));
3 Likes

Ví dụ cho bạn dễ hiểu

int read_size(); // Hàm này sẽ đọc dữ liệu đầu vào của người dùng (giả sử luôn là số) và trả về

int main() {
    const int size = read_size(); // Đoạn này vẫn hợp lệ
    // Nhưng vấn đề là read_size có thể trả về bất kì con số gì trong khoảng của nó

    int data[size] = {0, 1, 2, 3, 4}; // Lỗi ở đây
    return 0;
}
2 Likes

Cái này liên quan đến thiết kế ngôn ngữ rồi :slight_smile:

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