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
Bài liên quan
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]
vàsp[4]
là 2 giá trịint
ở trên stackNếu grow xuôi thì
sp
tăng lên 8 byte,sp[-8]
vàsp[-4]
là giá trị 2 biếnint
, xấu hơn là grow ngược.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…
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?
Hình như chrome mới update để chống Unicode fishing thì phải :))

32-bit mà 8 chữ số hex.
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 ra9
chứ ko in ra0000009
chẳng hạn.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 =)
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à