Array [n] vs Array [10] - Khởi tạo mảng với biến so với số thực


90

Tôi đang gặp sự cố sau với mã của mình:

int n = 10;
double tenorData[n]   =   {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

Trả về lỗi sau:

error: variable-sized object 'tenorData' may not be initialized

Trong khi sử dụng double tenorData[10]công trình.

Có ai biết tại sao không?


4
Nó sẽ giúp đưa ra một ngôn ngữ. Trong C ++, các mảng của bạn có dạng đó cần phải có kích thước không đổi theo thời gian biên dịch.
OrangeAlmondSoap

C ++, sử dụng Codeblocks với trình biên dịch mingw32-g ++!
msmf14

Cảm ơn Justin và @AndrewVarnerin, điều đó đã giải quyết được nó! thêm const trước int: const int n = 10; Đã giải quyết!
msmf14

Câu trả lời:


188

Trong C ++, mảng có độ dài thay đổi không hợp pháp. G ++ cho phép điều này như một "phần mở rộng" (vì C cho phép nó), vì vậy trong G ++ (không -pedantictuân theo tiêu chuẩn C ++), bạn có thể thực hiện:

int n = 10;
double a[n]; // Legal in g++ (with extensions), illegal in proper C++

Nếu bạn muốn có một "mảng có độ dài thay đổi" (tốt hơn được gọi là "mảng có kích thước động" trong C ++, vì không cho phép các mảng có độ dài biến đổi thích hợp), bạn phải tự cấp phát bộ nhớ động:

int n = 10;
double* a = new double[n]; // Don't forget to delete [] a; when you're done!

Hoặc, tốt hơn, sử dụng một vùng chứa tiêu chuẩn:

int n = 10;
std::vector<double> a(n); // Don't forget to #include <vector>

Nếu bạn vẫn muốn có một mảng thích hợp, bạn có thể sử dụng một hằng số , không phải một biến , khi tạo nó:

const int n = 10;
double a[n]; // now valid, since n isn't a variable (it's a compile time constant)

Tương tự, nếu bạn muốn lấy kích thước từ một hàm trong C ++ 11, bạn có thể sử dụng constexpr:

constexpr int n()
{
    return 10;
}

double a[n()]; // n() is a compile time constant expression

1
Cảm ơn bạn, đây là một giải pháp tốt. Cuối cùng thứ tôi thực sự cần là một vector hơn là một mảng!
msmf14

1
@ msmf14: Vâng, các thùng chứa tiêu chuẩn, giống như vector, cực kỳ hữu ích.
Cornstalks

Giải pháp vectơ có khởi tạo từng phần tử khi bạn gọi "std :: vector <[some class]> a (n);" không?
Justin

3
Nếu bạn không phân bổ nhiều (nếu nó nhỏ so với kích thước ngăn xếp), tôi muốn sử dụng bộ nhớ ngăn xếp với alloca (3) và vị trí mới. Bằng cách này, bạn không cần phải lo lắng về việc giải phóng bộ nhớ và phân bổ bộ nhớ nhanh hơn nhiều.
holgac

2
+1 vì đã đề cập rằng g ++ cho phép nó. Bởi vì tôi đã không quan sát thấy lỗi này và điều này giải thích sự khác biệt.
gebbissimo 27/09/18
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.