Vùng nhớ Stack trong C?

Bạn hiểu nhầm rồi, biến trong stack sẽ bị hủy ngay lập tức khi ra khỏi hàm chứ không phải khi thoát chương trình. Stack tạo và hủy liên tục khi chương trình đang chạy.

Câu hỏi này chung chung quá. Không thể giải thích được. Thêm nữa, nội dung của topic này không liên quan đến câu hỏi mà bạn đang hỏi.

1 Like

A Đạt nói chí phải. còn mình thì chưa tìm hiểu sâu về vùng nhớ nắm. chỉ có xoá sau khi tạo. dân quèn nên nhiều lúc mình mặc nó. ram cũng ko tôn lắm. sau này nếu code nhiều có lẽ sẽ tự nước chảy thành sông giống anh Lập trình sư đã nói

Anh Đạt cho em hỏi, như trong code của bạn ở trên, thì s nằm trong stack, nếu trong stack thì ra khỏi hàm thì sẽ bị xóa, em nghĩ vùng nhớ sẽ sống đến hết chương trình là vùng nhớ mà s trỏ tới, chứ không phải là s. Không biết như vậy có đúng không

Hi @thuan, Topic này đã 10 tháng trước rồi nên Đat không biết chính xác là bạn đang nói về đoạn code nào. @thuan cho biết cụ thể đoạn code được không?

Đoạn code này đó anh :slight_smile:

int p[10];
int foo(int x) {
    static int q [10] ;
    int r [10] ;
    int s = new int [10] ;
    switch ( x ) {
    case 1 :
        return p ;
    case 2 :
        return q ;
    case 3 :
        return r ;
    case 4 :
        return s ;
    default :
        foo ( x+1);
    }
}
int p[10];
int foo(int x) {
    static int q [10] ;
    int r [10] ;
    int s = new int [10] ;
    switch ( x ) {
    case 1 :
        return p ;
    case 2 :
        return q ;
    case 3 :
        return r ;
    case 4 :
        return s ;
    default :
        foo ( x+1);
    }
}

Đúng vậy.

Thấy mọi người trả lời sôi nổi và đầy đủ rồi nhưng đối với những bạn newbie thì sẽ hơi rắc rối nên mình nêu ý kiến đơn giản của mình cho các bạn mới học lập trình dễ hiểu luôn nhé (các pro đừng chém mình)
Trong bộ nhớ được chia làm 4 phần chính:

  • Code Segment
  • Data Segment
  • Heap
  • Stack

=> Code segment là nơi lưu trữ mã máy dạng nhị phân. Tức là chương trình bạn code thì bạn code bằng ngôn ngữ tự nhiên của con người (như if, else, for, int, …) nhưng cần phải dịch sang dạng nhị phân (1010111010001 …) thì máy tính mới hiểu được code.

=> Data Segment là nơi chứa các biến tĩnh (như static) và biến toàn cục. (biến nằm ngoài các hàm)

=> Heap là vùng nhớ không do CPU quản lý, lập trình viên sẽ quản lý vùng nhớ này. Tức là vùng nhớ này sẽ quản lý các con trỏ mà bạn cấp phát bộ nhớ. Nói cách khác, vùng nhớ Heap dành cho con trỏ.

=> 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 {} ).

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.

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