2015-11-26 18 views
7

Trong C99, dòng mã sau tạo một ptr biến trên ngăn xếp trỏ đến vùng bộ nhớ trên heap.Stack và đống trong ngôn ngữ lập trình

int *ptr = (int*)malloc(sizeof(int)*10); 

Định nghĩa của chồng và đống ở đâu? Tôi không thể tìm thấy chúng trong đặc tả ngôn ngữ C99.

Có phải chồng và đống được xác định bởi hệ điều hành hoặc kiến ​​trúc bộ lệnh hoặc cái gì khác không?

Một câu hỏi khác có liên quan là liệu khái niệm về ngăn xếp và đống trong C# có chính xác giống như khái niệm trong C99 không? Vì mã C# được chạy trên khung .Net, tôi không chắc liệu khái niệm này có giống với C99 hay không.

+0

Điều này sẽ giúp bạn một phần. Có một câu trả lời hay. http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap – niksofteng

+0

Cảm ơn thông tin của bạn. Tuy nhiên, câu hỏi chính là đâu là định nghĩa? – mingpepe

+0

Trong C, "ngăn xếp" và "đống" là các từ thông tục. – immibis

Trả lời

1

Vùng heap là lượng bộ nhớ được cấp phát cho một quy trình nhất định đang chạy trên máy. Ngăn xếp là một lượng bộ nhớ thường nhỏ hơn được cấp phát cho luồng hiện đang chạy trên quy trình đã cho.

Khi bạn tạo biến cục bộ, biến được lưu trữ vào ngăn xếp. Lựa chọn bộ nhớ này được gọi là ngăn xếp vì vì nó đề cập đến phạm vi các giá trị khác nhau được đẩy hoặc xuất hiện từ không gian địa chỉ như bạn sẽ làm với cấu trúc dữ liệu ngăn xếp.

Sau đó, khi bạn malloc một biến nó được lưu trữ vào heap và do đó được lưu ngay cả trên nhiều phạm vi.

Lưu ý rằng mọi thứ được lưu trữ trên heap phải được giải phóng khi bạn sử dụng xong chúng, trong khi hệ điều hành tự động xử lý cho mọi thứ trên ngăn xếp.

checkout http://gribblelab.org/CBootcamp/7_Memory_Stack_vs_Heap.html

6

Ngăn xếp và đống là chi tiết triển khai; như bạn đã khám phá, định nghĩa ngôn ngữ C không đề cập đến chúng.

Định nghĩa ngôn ngữ C nói về thời lượng lưu trữ đối tượng. Các đối tượng có thời lượng lưu trữ là auto có thời gian tồn tại kéo dài trên khối bao quanh của chúng; nó chỉ xảy ra khi ngăn xếp phần cứng làm cho hành vi đó dễ thực hiện, vì vậy hầu như tất cả các triển khai C đều làm như vậy. Các đối tượng có thời lượng lưu trữ là allocated có thời gian tồn tại kéo dài từ cuộc gọi malloc/calloc/realloc cho đến khi có cuộc gọi đến free. Một lần nữa, hầu như tất cả các triển khai C tận dụng lợi thế của hệ thống heap cho hành vi đó.

Tuy nhiên, triển khai không để sử dụng ngăn xếp hoặc đống do hệ thống cung cấp để đáp ứng các yêu cầu về thời lượng lưu trữ đối tượng; nó sẽ chỉ là một công việc nhiều hơn một chút.

+0

Ngăn xếp hoặc đống do hệ thống cung cấp là gì? Trong quan điểm của phần cứng, họ là những điều tương tự phải không? Vậy chúng có được định nghĩa bởi hệ điều hành không? – mingpepe

+0

@mingpepe - ngăn xếp thường được xác định bởi nền tảng phần cứng (hầu hết các CPU tôi quen thuộc với dành một vài thanh ghi để quản lý ngăn xếp). Heaps được trộn lẫn giữa phần cứng và hệ điều hành. Triển khai khác nhau. –

+0

Điều gì có nghĩa là đống được trộn giữa phần cứng và hệ điều hành? – mingpepe

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