01/10/2018, 09:32

Địa chỉ con trỏ

Mình có đoạn code sau:

#include <iostream>
using namespace std;
int main(){
	int *p = new int;
	cout<<p<<endl<<&p;
	return 0;
}

Cho mình hỏi tại sao địa chỉ mà p lưu trữ (nằm trên heap) chỉ có 7 chữ số hex, còn địa chỉ của p (nằm trên stack) lại có 8 chữ số hex?
Đây là kết quả mình chạy trên codepad: http://codepad.org/ZZXIHlsR

viết 11:43 ngày 01/10/2018

tùy trình biên dịch mà stack grow ngược hay xuôi. Grow ngược nhiều hơn. Stack chỉ cần 1 con trỏ sp.

Nếu grow ngược thì ví dụ tạo 2 biến int trên stack, sp giảm đi 8 byte, sp[0]sp[4] là 2 giá trị int ở trên stack

[][][][][][][][]
                ^sp

sau khi đẩy 2 biến int lên stack:
[][][][][][][][]
^sp     ^sp+4

Nếu grow xuôi thì sp tăng lên 8 byte, sp[-8]sp[-4] là giá trị 2 biến int, xấu hơn là grow ngược.

[][][][][][][][]
^sp

sau khi đẩy 2 biến int lên stack:
[][][][][][][][]
^sp-8   ^sp-4   ^sp

grow ngược thì biến trên stack có địa chỉ lớn => 8 con số.

heap grow kiểu nào cũng được => chọn grow xuôi cho dễ hiểu, stack grow ngược thì tốt hơn…

Vu Dao Anh Tuan viết 11:40 ngày 01/10/2018

cho mình hỏi là mọi địa chỉ dù nằm trên stack hay heap đều có 8 số hex (32 bit) phải không, và theo bạn giải thích thì do heap grow từ thấp lên cao nên địa chỉ nhỏ, còn stack từ trên xuống nên địa chỉ cao, nhưng mà vẫn phải đủ 8 số để biểu diễn 1 địa chỉ phải không?

Trần Hoàn viết 11:38 ngày 01/10/2018

Hình như chrome mới update để chống Unicode fishing thì phải :))

rogp10 viết 11:44 ngày 01/10/2018

32-bit mà 8 chữ số hex.

viết 11:33 ngày 01/10/2018

cũng tùy vào OS/compiler nữa, có thể con trỏ là 64-bit => 16 số hex.

còn sở dĩ in ra có 7 số vì số 0 đầu tiên (leading zeros) nó ko in ra, giống như cout << 9 thì nó in ra 9 chứ ko in ra 0000009 chẳng hạn.

viết 11:43 ngày 01/10/2018

có phishing đâu, gõ thử trí.com vào thanh địa chỉ rồi enter là biết nó là gì à

nó cũng ko phải là Unicode mà là Punycode. Mấy bữa chèn thêm mấy dấu tầm bậy Zalgo text cho nó che bớt thôi mà

á mới phát hiện gõ sai, xn–tr-oja mới đúng =)

Trần Hoàn viết 11:37 ngày 01/10/2018

Tại vì trước thấy tên của bác nó toàn ký tự xèo xèo xẹt xẹt, hôm nay thấy nó hiện vậy tưởng do Chrome cập nhật để chống Punycode Fishing. Mà đúng Punycode Fishing dựa trên các ký tự Unicode giống nhau mà

Bài liên quan
0