30/09/2018, 16:03

Cùng đặt vấn đề nào (Bản số 5)

OK. Topics số 5 này sẻ chuyển qua một vấn đề mới, như các bạn đã biết hoặc chưa biết , bộ nhớ là một phần rất quan trong trong khoa học máy móc(chém tí), vì thế sẽ rất tốt nếu chúng ta hiểu rõ các quy tắc lưu trữ, cấp phát của bộ nhớ Memory. Nên mình sẽ có một câu hỏi là, những biến dưới đây được lưu trữ như thế nào khi chương trình được thực thi.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int a = 5;
int d;
char  b[6] = "hello";
const int c = 4;

void myfuntion(){
     static int g = 5;
     const int h = 6;
     char i;
}

int main (){
     static int d = 6;
     const int e = 3;
     char *f;
     f = (char*)malloc(5);
     myfuntion();
}
Nguyễn Minh Dũng viết 18:10 ngày 30/09/2018

Haha, câu này khó quá. A cũng không biết trả lời. Em giải thích câu hỏi rõ hơn tí đi. Hoặc gợi ý

Dũng Kon viết 18:12 ngày 30/09/2018

Theo hiểu biết hạn hẹp của em thì bộ nhớ chia làm 4 phân đoạn, một phân đoạn được dùng để lưu trữ các chỉ thị, hướng dẫn hay còn gọi là code. Một phân đoạn được cắt ra để lưu trữ các biến tĩnh và biến toàn cục, các biến này không được khởi tạo trong hàm (toàn cục) chúng sẽ tồn tại trong toàn thời gian của một chương trình miễn là chương trình đang chạy, lấy ra lúc nào cũng được. Một phần nữa được gọi là stack dùng để lưu trữ tất cả thông tin của hàm được gọi và tất cả các biến cục bộ. Phần cuối là Heap nó dùng để lưu trữ… éc bí từ, không biết nói sao ta, đại loại là chúng ta xin cấp phát một vùng nhớ bằng cách gọi các hàm malloc(), realloc(), … trong C hay toán tử new trong Cpp ấy (thế mới có lệnh delete hay hàm free()) vì xin xong không trả thì có nhiều vấn đề phát sinh lắm. Không biết có gì sai không, mới ngũ dậy chưa tỉnh lắm viết sai mọi người thông cảm

Nguyễn Minh Dũng viết 18:17 ngày 30/09/2018

Em viết vậy cũng đúng rồi, anh cũng biết cái này nhưng chưa có cơ hội kiểm chứng nên không dám nói sâu về nó.

Có thể trả lời nước đôi như sau:

int a = 5; sẽ được đặt trong vùng nhớ toàn cục
int d; sẽ được đặt trong vùng nhớ toàn cục và gán cho d = 0
char b[6] = "hello"; // b[6] hơi rắc rối, nhưng nó sẽ được tạo trong vùng nhớ toàn cục, "hello" được đặt trong TEXT
static int g = 5; g được đánh dấu là static và cấp vùng nhớ riêng, cũng giống toàn cục, chỉ bị hủy khi tắt chương trình
const int h = 6; được đánh dấu là hằng
char i; được tạo trong stack
char *f; được tạo trong stack
f = (char*)malloc(5); vùng nhớ mà f sẽ trỏ tới được tạo ra trong heap
Dũng Kon viết 18:19 ngày 30/09/2018

Hay lắm, em đã học qua nhưng chưa bao giờ được kiểm chứng thật sự mấy cái này cả, lâu rồi nên muốn khơi lại thôi.

Bài liên quan
0