2013-08-22 60 views
5

Cách xác định của nó? Điều này có phụ thuộc vào hệ thống trình biên dịch/Kiến trúc/Máy chủ không?Kích thước tối đa của mảng tĩnh có thể được khai báo trong GCC là gì?

Ví dụ:

int array[0x8000000000000000]; 

Đối với dòng này trong một hệ thống chút x86_64 đầu ra GCC:

Error "size of array 'array' is too large". 
+0

Điều này ít liên quan đến GCC. Nếu bạn có nghĩa là một đối tượng mảng phạm vi khối với thời gian lưu trữ tự động bởi "mảng tĩnh", thì có hay không nó phù hợp với bộ nhớ phụ thuộc vào kích thước ngăn xếp (giả sử kiến ​​trúc của bạn có một ngăn xếp). –

+0

Những gì tôi có nghĩa là bởi mảng tĩnh là một mảng tuyên bố như thế này: int array [50]? Tôi nhận được một "kích thước của mảng là lỗi quá lớn" trong Gcc trong thời gian biên dịch? – ted

+0

Vâng, loại mảng đó được gọi là "đối tượng mảng [phạm vi khối | phạm vi tệp] với thời lượng lưu trữ tự động". Nếu bạn nhận được một lỗi biên dịch, đó là bởi vì GCC là quá hăng hái (không phải là nó xấu!) Và về cơ bản bảo vệ bạn khỏi chính mình. Tuy nhiên, điều này không phụ thuộc vào trình biên dịch, theo kiểu cổ điển. –

Trả lời

15

By mảng tĩnh, tôi giả sử, bạn có nghĩa là một mảng chiều dài cố định (tĩnh được phân bổ, như int array[SIZE] , không được phân bổ động). Giới hạn kích thước mảng nên phụ thuộc vào phạm vi của mảng được khai báo.

  • Nếu bạn đã khai báo mảng trong phạm vi cục bộ (bên trong một số thường trình), giới hạn kích thước được xác định theo kích thước ngăn xếp.
  • Nếu gcc đang chạy trên linux, kích thước ngăn xếp được xác định bởi một số biến môi trường. Sử dụng ulimit -a để xem và ulimit -s STACK_SIZE để sửa đổi kích thước ngăn xếp.
  • Nếu gcc đang chạy trên các cửa sổ (như MinGW), kích thước ngăn xếp có thể được chỉ định bởi gcc -Wl, - stack, STACK_SIZE.
  • Nếu bạn đã khai báo mảng trong phạm vi toàn cục, mảng được lưu trữ trong phần DATA hoặc BSS (dựa trên việc mảng được khởi tạo hoặc chưa được khởi tạo lần lượt). Kích thước phần DATA và BSS được xác định bởi hệ điều hành cơ sở.
  • Nếu bạn đã khai báo mảng trong phạm vi tĩnh (như static int array[SIZE]), một lần nữa, mảng được lưu trữ trong phần DATA hoặc BSS (dựa trên việc mảng được khởi tạo hay chưa được khởi tạo lần lượt). Kích thước phần DATA và BSS được xác định bởi hệ điều hành cơ sở.
+1

Điều thú vị nhất là có một số số (ngay cả khi chúng có thể thay đổi) về giới hạn kích thước phần DATA/BSS từ Linux và Windows. –

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