2010-05-19 35 views
26

Tôi luôn nghĩ rằng khi khai báo một mảng trong C++, kích thước phải là một giá trị nguyên không đổi.Khai báo kích thước mảng với biến không đổi

Ví dụ:

int MyArray[5]; // correct 

hoặc

const int ARRAY_SIZE = 6; 
int MyArray[ARRAY_SIZE]; // correct 

nhưng

int ArraySize = 5; 
int MyArray[ArraySize]; // incorrect 

Dưới đây là cũng là những gì được giải thích trong The C++ Programming Language, by Bjarne Stroustrup:

Số phần tử của mảng, mảng bị ràng buộc, phải là một biểu thức không đổi (§C.5). Nếu bạn cần các giới hạn khác nhau, hãy sử dụng một vectơ (§3.7.1, §16.3). Ví dụ:

void f(int i) { 
    int v1[i];   // error : array size not a constant expression 
    vector<int> v2(i); // ok 
} 

Nhưng trước sự ngạc nhiên lớn của tôi, đoạn mã trên không biên dịch tốt trên hệ thống của tôi!

Đây là những gì tôi đã cố gắng để biên dịch:

void f(int i) { 
    int v2[i]; 
} 

int main() 
{ 
    int i = 3; 
    int v1[i]; 
    f(5); 
} 

tôi đã không có lỗi! Tôi đang sử dụng GCC v4.4.0.

Có điều gì tôi thiếu không?

+17

Và đây là lý do tại sao thử nghiệm điều gì đó với trình biên dịch không có nghĩa là bất kỳ điều gì về độ chính xác của mã. – GManNickG

+1

Bản sao của http://stackoverflow.com/questions/737240/c-c-array-size-at-run-time-w-o-dynamic-allocation-is-allowed – nico

Trả lời

24

Đây là phần mở rộng GCC theo tiêu chuẩn: see here.

Bạn có thể sử dụng tùy chọn -pedantic để GCC phát hành cảnh báo hoặc -std=c++98 để thực hiện lỗi, khi bạn sử dụng một trong các tiện ích mở rộng này (trong trường hợp tính di động là mối quan tâm).

6

Bạn đang sử dụng tính năng từ C99 được gọi là VLA (mảng độ dài biến đổi). Sẽ tốt hơn nếu bạn biên dịch chương trình của bạn như thế này:

g++ -Wall -std=c++98 myprog.cpp 
Các vấn đề liên quan