Vùng nhớ Stack trong C?

Chỗ này sai

=> Stack là vùng nhớ do CPU quản lý, lập trình viên không thể can thiệp vào, nếu cố tình can thiệp sẽ bị lỗi. Vùng nhớ này chứa các biến cục bộ (biến được bao phủ bởi dấu {} ).

1 Like

Ngắn gọn đầy đủ
Stack vs Heap Pros and Cons
Stack

  • very fast access
  • don’t have to explicitly de-allocate variables
  • space is managed efficiently by CPU, memory will not become fragmented
  • local variables only
  • limit on stack size (OS-dependent)
  • variables cannot be resized

Heap

  • variables can be accessed globally
  • no limit on memory size
  • (relatively) slower access
  • no guaranteed efficient use of space, memory may become fragmented over time as blocks of memory are allocated, then freed
  • you must manage memory (you’re in charge of allocating and freeing variables)
  • variables can be resized using realloc()

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

1 Like

Chỗ này cũng không ổn, nó bị giới hạn bởi số lượng vùng nhớ vật lý (RAM, …), ngoài ra nó còn bị giới hạn lúc bộ nhớ bị phân mảnh nữa, tức là bộ nhớ còn lại là 1GB nhưng bị phân mảnh thì không thể cấp phát một vùng nhớ liên tục 1GB được

1 Like

nếu zo project lớn thì lâu lâu lại quên, có hàm nào duyệt memory leak ko nhỉ

Uầy, tự nhiên có ai đào mộ, vô đây mới thấy có người reply câu trả lời của mình !

Cho em xin ý kiến của anh @tranhuanltv vì sao nó sai ạ :blush:

Vì mình hoàn toàn có thể tạo một vùng nhớ trên stack và thay đổi giá trị của nó
VD:

void doSomething()
{
     char buffer[256];
     buffer[0] = '\0';
}

buffer ở đây được khởi tạo trên stack

Tức là sai chỗ này ạ ?

Hmm, tức là có thể can thiệp chứ không phải “không thể can thiệp vào”

1 Like

“Can thiệp” nó nghĩa khác anh ạ :slight_smile:
VD:

int x;
int *y = &x;
delete y;

Giả sử cho biến kiểu intx, con trỏ inty trỏ đến x
=> xy đang nằm trong stack
Bây giờ mình mà giải phóng con trỏ y thì đó mới gọi là “can thiệp” đại loại là như thế :slight_smile:
Nên khi để delete y hoặc free(y) thì chương trình báo lỗi ngay
Xin ý kiến của anh ạ :smiley:

Vậy thì nên sử dụng “bị hạn chế” thay vì “không thể can thiệp”. Bất kì hành vi nào có thể làm thay đổi stack thì cũng là “can thiệp” rồi

Vậy khi nào dùng stack,khi nào dùng heap ạ? Với kiến thức em hiện giờ thì dùng heap khi không biết kích cỡ của input, nhưng mình có thể sửa bằng cách dùng mảng động phải không ạ #@@
P/s: em không cố ý đào mộ đâu :slight_smile:

gọi hàm đệ quy circle() sẽ gây stack overload.Em hiểu là bác biến cục bộ và tham số truyền vào hàm sẽ lưu vào stack nhưng ở đây chương trình không khởi tạo một biến cục bộ và một tham số truyền vào nào.Vậy gây nên stack overload ở đây là gì ạ.Em cảm ơn

Địa chỉ hàm gọi cũng được tính là chi phí trong 1 stack frame.

Khi gọi hàm thì phải push địa chỉ trở về vào stack.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?