2011-12-02 40 views
5

Vì vậy, tôi đã nói chuyện với bạn của tôi, giúp cô ấy với một đoạn mã, và tôi luôn luôn nghĩ rằng mảng cần phải được biên dịch thời gian hằng số, khi họ đang trên stack. Nhưng cô ấy nói rằng bạn của cô ấy đã làm điều này bằng cách sử dụng mã này:Mảng có kích thước xác định tại thời gian chạy, có hợp lệ trong C++ không?

#include <iostream.h> 
#include <stdlib.h> 
int main() 
{ 
    int value = ' ' ; 
    int sum = 0; 
    int count = 0; 
    cout<<"Please enter the total number of employees" <<endl;; 
    cin>> value; 
    int numbers[value]; 
    cout<<"Now enter the employees corresponding salaries" <<endl;; 
    for (int k = 0; k < value; k++) 
    { 
     cin >> numbers[k]; 
    } 
} 

Họ đang sử dụng Dev-C++.

Mã này có giả sử hoạt động không? Tôi cho là không.

+0

bản sao có thể có của [Có cách nào để tạo một mảng chiều dài biến toàn cầu trong C++ không?] (Http://stackoverflow.com/questions/3903232/is-there-any-way-to-make-a-variable -length-array-global-in-c) –

+1

Có lý do gì khiến cô ấy khởi tạo 'value' thành' '' 'không? Trình biên dịch sẽ không quan tâm (nó sẽ đưa '' ''char vào giá trị ASCII của nó,' 32'), nhưng 32 có vẻ giống như một số lẻ, ngẫu nhiên để khởi tạo một int. –

+0

Họ không phải là lập trình viên, chỉ là sinh viên đại học chung. Tôi không thể cho bạn biết tại sao cô ấy chọn '', \ n sẽ ổn thôi. – jValdron

Trả lời

9

Mảng có độ dài thay đổi là một phần mở rộng trong gccg++ ... do đó điều này sẽ không hoạt động trong mọi trình biên dịch.

Để biết thêm thông tin về sự hỗ trợ của gcc cho các mảng độ dài biến đổi, bạn có thể xem documentation here.

4

Tôi tin rằng các mảng độ dài biến đổi chính thức không được hỗ trợ trong C++ nhưng một số trình biên dịch và/hoặc phần mở rộng ngôn ngữ nhất định thực hiện chúng.

Nếu bạn muốn một mảng độ dài thay đổi, tôi khuyên bạn nên sử dụng std :: vector. Bạn có thể xem tài liệu tham khảo của nó ở đây:

http://www.cplusplus.com/reference/stl/vector/

2
#include <iostream.h> 

^không phải là một tiêu đề tiêu chuẩn. Nó thường ở đó trong thời gian chuẩn trước, tức là trước năm 1998. Nó không có trong ví dụ. Visual C++ hiện đại.

cin>> value; 
int numbers[value]; 

Mảng thời lượng biến thiên hoặc VLA, được giới thiệu trong C99, một năm sau khi C++ được chuẩn hóa. Vì vậy, họ không phải là một phần của tiêu chuẩn gốc C++, và hạnh phúc họ cũng không được chấp nhận trong C++ 11. Thay vì con thú như vậy, hãy sử dụng ví dụ: std::vector từ tiêu đề vector hoặc một số vùng chứa thư viện chuẩn khác.

g ++ hỗ trợ các mảng có độ dài thay đổi dưới dạng tiện ích mở rộng ngôn ngữ . Bạn nên tắt phần mở rộng như vậy. Ví dụ:

 
d:\dev\test> g++ foo.cpp 

d:\dev\test> g++ -pedantic -std=c++0x -Wall -O foo.cpp 
foo.cpp: In function 'int main()': 
foo.cpp:11: warning: ISO C++ forbids variable length array 'numbers' 
foo.cpp:7: warning: unused variable 'sum' 
foo.cpp:8: warning: unused variable 'count' 

d:\dev\test> _ 
0

Tôi đã thử biên dịch bằng GCC 4.6 và thấy rằng mã bạn đã đăng được biên dịch thành công. Tôi cũng đã thử chạy nó và thấy rằng nó làm việc, nhưng tôi không nghĩ rằng mã là rất tốt.

Các vấn đề liên quan