Toán tử con trỏ và vùng nhớ stack

các bác cho em hỏi là việc khai báo liên tiếp 2 liền nhau ví du như:
int a = 10;
int b = 9;
thì a và b có được cấp phát vùng nhớ vào stack có địa chỉ nằm cạnh nhau không ạ . tại em nhớ là stack là kiểu dữ liệu xếp chồng.
em đã làm thực nghiệm


cho em hỏi tại sao khi xóa dòng printf địa chỉ ( dòng thứ 12) kia thì ko set được giá trị cho biến n2 còn để nguyên dòng printf mới set đc giá trị ạ ??

Do compiler nó tự optimize code. Biến n2 nếu k được dùng ở bất kì vị trí nào nên nó sẽ bỏ luôn biến n2

1 Like

cả 2 trường hợp đều dùng đến biến n2 lúc xuất ra giá trị mà anh. Chỉ khác 1 trường hợp có lệnh printf địa chỉ của n2 thì nó sẽ đổi n2 thành -3 còn không có lệnh printf thì k đổi ạ

printf nó sẽ thay biến thành hằng số luôn vì giá trị đã được xác định ở compile time. Mình post lộn câu trả lời sang 1 post khác của bạn rồi @@. Bạn quá đó xem giúp mình :smiley:

2 Likes

dạ em cảm ơn anh nhiều ạ

Compiler nó rất thông minh. Nếu biến đó k được gán hoặc nếu nó được xác định ngay từ compile time thì nó sẽ cho thành hằng luôn. Ví dụ
image
khi compile ra nó sẽ như thế này
image

Hơn nữa không có gì là đảm bảo 2 biến đứng cạnh nhau sẽ đứng cạnh nhau trong bộ nhớ :smiley:
Compiler nó làm mọi thứ behind-the-scenes rồi. Các lí thuyết đó chưa chắc đã áp dụng được đúng với trình dịch hiện đại (+ optimization) :smiley:

8 Likes

tức là vậy p-- là nó trỏ đến một vùng nhớ khác chứ k phải trỏ đến n2 phải k ạ và biến v4 của anh là 1 vùng nhớ bất kì trong bộ nhớ phải k ạ ?

Việc n1 và n2 nằm cạnh nhau là k đc đảm bảo nên p++ hay – thì nó sẽ hên xui. Còn cái code bên dưới là code dịch ngược từ exe ra c++.

Có thể n1 sau đó nó có biến ở giữa rồi mới đên n2. Nó vẫn sẽ nằm trên stack và đúng quy tắc của stack. Chỉ là nó có kề nhau hay ko thì k chắc. Hơn nữa trên stack k chỉ có biến tự định nghĩa mà compiler nó cũng sẽ có thể có thêm biến để thực hiện 1 số tối ưu hoặc chèn code để intercept debugger ở chế độ debug

2 Likes

dạ vậng thế thì em hiểu r ạ em cảm ơn anh

Mod đã bê post của bạn sang đây cả rồi, bạn yên tâm nha.

3 Likes

Cảm ơn mod ạ :smiley:

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