cái này dựa trên 4 điều kiện mà hết 3 là C++ ko (cần) có:
- thứ nhất là dựa trên flexible array là extension từ C :V C++ ko có.
- thứ hai là dựa trên thứ tự stack, maxsize → arr → num, điều này là ko thể đảm bảo. Thứ tự biến trên stack là tùy trình dịch sắp xếp sao cho tối ưu.
- thứ ba là dựa trên small string optimization (SSO) của các trình dịch, chuẩn C++ ko bắt buộc phải có.
- thứ tư là
num
nhập vào phải nhỏ, ko quá 7/15 ký tự gì đấy tùy vào chương trình biên dịch ra chạy ở chế độ 32-bit hay 64-bit, và tùy vào implementation của SSO nữa :V
khi đã assume 4 điều kiện VÔ LÝ này đủ rồi thì code này có thể chạy:
--> chiều tăng dần địa chỉ
num (24 byte nếu chương trình compile ở chế độ 64-bit, 12 ở 32-bit)
↓
[.][.][.][.][..........]
↑ ↑
maxsize arr
(4 bytte) (flexible array)
flexible array arr
giống như con trỏ nhưng ko chiếm 8 byte bộ nhớ như con trỏ, và nó trỏ vào bộ nhớ tại vị trí khai báo của nó, mà ở đây vô tình là sau maxsize
và đè lên phần bộ nhớ của num
.
nếu num
nhập vào nhỏ hơn ví dụ ở đây là chương trình 64-bit thì nhỏ hơn 15 ký tự và SSO của trình dịch này để num.size
ở 8 byte cuối thì arr
sẽ chiếm đúng các byte chứa nội dung nhập vào (nhỏ hơn 15 ký tự), nên xài arr[i]
để truy cập num[i]
được :V
còn cái code vòng for kia ko hiểu làm cái gì :V :V có so sánh gì đâu mà phán palindrome được :V
khi compile nhớ cho flag -pedantic
vào diệt hết ba cái C extensions này nha