Điều này là do ngôn ngữ C++ không có tính năng C được giới thiệu trong C99 được gọi là "mảng độ dài biến đổi" (VLA).
C++ đang tụt hậu trong việc áp dụng tính năng C này vì loại std::vector
từ thư viện của nó đáp ứng hầu hết các yêu cầu.
Hơn nữa, tiêu chuẩn năm 2011 của C đã bị đảo ngược và làm VLA là một tính năng tùy chọn.
VLA, trong Tóm lại, cho phép bạn sử dụng một giá trị thời gian chạy để xác định kích thước của một mảng địa phương được phân bổ trong lưu trữ tự động:
int func(int variable)
{
long array[variable]; // VLA feature
// loop over array
for (size_t i = 0; i < sizeof array/sizeof array[0]; i++) {
// the above sizeof is also a VLA feature: it yields the dynamic
// size of the array, and so is not a compile-time constant,
// unlike other uses of sizeof!
}
}
VLA của tồn tại trong phương ngữ GNU C dài trước C99. Trong các phương ngữ của C không có VLA, các tham số mảng trong một khai báo phải là các biểu thức không đổi.
Ngay cả trong các phương ngữ C với VLA, chỉ một số mảng nhất định có thể là VLA. Ví dụ, mảng tĩnh không thể, và không thể mảng động (ví dụ mảng bên trong một cấu trúc, ngay cả khi trường hợp của cấu trúc đó được phân bổ động).
Trong mọi trường hợp, vì bạn đang mã hóa bằng C++, đây là tranh luận!
Lưu ý rằng bộ nhớ được phân bổ với operator new
không phải là tính năng VLA. Đây là một cú pháp C++ đặc biệt để phân bổ động, mà trả về một kiểu con trỏ, như bạn đã biết:
int *p = new int[variable];
Không giống như một của VLA, đối tượng này sẽ kéo dài cho đến khi nó bị phá hủy một cách rõ ràng với delete []
, và có thể được trả lại từ xung quanh phạm vi.
Vì vậy, được gọi là mảng độ dài biến đổi. Dưới đây là một số câu trả lời tại sao chúng không được phép trong C++ -> https://groups.google.com/forum/#!topic/comp.std.c++/K_4lgA1JYeg Chúng hợp lệ trong C BTW. – doc
Trường hợp thứ hai được phân bổ heap, trong khi trường hợp thứ nhất (có giá trị trong C99) sẽ được phân bổ theo từng ngăn xếp. – Thilo
Trong phiên bản C hỗ trợ VLAs, 'int array [n];' tạo một đối tượng mảng có kiểu thực sự là 'int [n]'. 'new int [n]' không tạo ra một kiểu mảng; nó chỉ sinh ra một con trỏ 'int *' trỏ đến phần tử đầu tiên của mảng được phân bổ. –