Tại sao chúng ta không thể khai báo một mảng, nói về kiểu int data , kích thước bất kỳ trong vòng giới hạn bộ nhớ?


0 Phiếu
Đã hỏi 24/5/2016 bởi Gun_that (660 điểm)
int A[10000000]; //This gives a segmentation fault
int *A = (int*)malloc(10000000*sizeof(int));//goes without any set fault.
bây giờ câu hỏi của tôi là, chỉ cần ra khỏi tò mò, mà nếu cuối cùng chúng ta có thể phân bổ các không gian cao hơn cho các cấu trúc data của chúng tôi, nói ví dụ, BSTs và danh sách liên kết tạo ra bằng cách sử dụng phương pháp tiếp cận con trỏ c đã không như là bộ nhớ như giới hạn (trừ khi Tổng kích thước vượt quá kích thước của RAM cho máy tính của chúng tôi) và ví dụ, trong statement thứ hai ở trên của tuyên bố một loại pointer , tại sao rằng chúng tôi không thể có một loạt các tuyên bố của kích thước cao hơn (cho đến khi nó đạt đến giới hạn bộ nhớ!!) ... Điều này là bởi vì không gian được phân bổ là liền kề nhau trong một mảng có kích thước static ?. Nhưng sau đó từ nơi chúng tôi nhận được bảo lãnh mà trong các từ 1000000 tiếp theo trong RAM không có phần khác của code sẽ chạy...?? PS: tôi có thể sai trong một số báo cáo tôi đã thực hiện... Xin vui lòng chính xác trong trường hợp đó.

2 Câu trả lời

+1 Phiếu
Đã trả lời 31/5/2016 bởi nelia (200 điểm)
Giả sử local biến, điều này là do trên hiện đại triển khai tự động biến sẽ được cấp phát trên stack mà là rất hạn chế trong không gian. Này liên kết cung cấp cho một số kích thước stack phổ biến:
platform    default size       
=====================================
SunOS/Solaris  8172K bytes
Linux          8172K bytes
Windows        1024K bytes
cygwin         2048K bytes
các bài viết được liên kết cũng lưu ý rằng kích thước stack có thể được thay đổi ví dụ trong Linux, một trong những cách có thể từ shell trước khi chạy process của bạn sẽ:
ulimit -s 32768 # bộ kích thước stack để 32M byte
trong khi malloc về việc triển khai hiện đại sẽ đến từ đống , đó chỉ giới hạn bộ nhớ của bạn đã có sẵn để process và trong nhiều trường hợp, bạn thậm chí có thể phân bổ nhiều hơn là có sẵn do overcommit .
Đã bình luận 01/6/2016 bởi Gun_That (252,760 điểm)
Vâng, mảng cấp phát một khối liền kề. C compiler đã hoàn toàn ** không ** ý tưởng của những gì đoạn mã thực tế hoạt động môi trường, do đó, nếu bạn muốn một mảng 32gig, nhưng bạn đang biên dịch trên một máy tính 16meg, nó không phải là công việc của trình biên dịch để cho bạn biết rằng bạn không có đủ bộ nhớ. Mảng MUSt được liên tục, hoặc một bó toàn bộ các code sử dụng pointer toán ngay lập tức sẽ bị hỏng khi mảng được phân chia thành nhiều khối.
0 Phiếu
Đã trả lời 03/6/2016 bởi creis (180 điểm)
Firstly, in a typical modern OS with virtual memory (Linux, Windows etc.) the amount of RAM makes no difference whatsoever. Your program is working with virtual memory, not with RAM. RAM is just a cache for virtual memory access. The absolute limiting factor for maximum array size is not RAM, it is the size of the available address space. Address space is the resource you have to worry about in OSes with virtual memory. In 32-bit OSes you have 4 gigabytes of address space, part of which is taken up for various household needs and the rest is available to you. In 64-bit OSes you theoretically have 16 exabytes of address space (less than that in practical implementations, since CPUs usually use less than 64 bits to represent the address), which can be perceived as practically unlimited. Secondly, the amount of available address space in a typical C/C++ implementation depends on the memory type. There's static memory, there's automatic memory, there's dynamic memory. The address space limits for each memory type are pre-set in advance by the compiler. Which raises the question: where are you declaring your large array? Which memory type? Automatic? Static? You provided no information, but this is absolutely necessary. If you are attempting to declare it as a local variable (automatic memory), then no wonder it doesn't work, since automatic memory (aka "stack memory") has very limited address space assigned to it. Your array simply does not fit. Meanwhile, malloc allocates dynamic memory, which normally has the largest amount of address space available. Thirdly, many compilers provide you with options that control the initial distribution of address space between different kinds of memory. You can request a much larger stack size for your program by manipulating such options. Quite possibly you can request a stack so large, than your local array will fit in it without any problems. But in practice, for obvious reasons, it makes very little sense to declare huge arrays as local variables.

ToughDev Q&A là gì?

Trang web hỏi đáp cho các bạn đam mê lập trình, phát triển phần mềm và các vấn đề kỹ thuật khác. Với sự giúp đỡ của bạn, chúng tôi hy vọng sẽ xây dựng thành công một thư viện đầy đủ các câu hỏi và trả lời về tất cả các vấn đề có liên quan đến lập trình!







...