变量在内存中是如何定位的?我有这个代码
int w=1;
int x=1;
int y=1;
int z=1;
int main(int argc, char** argv) {
printf("\nw %d",&w);
printf("\nx %d",&x);
printf("\ny %d",&y);
printf("\nz %d",&z);
trả về (EXIT_SUCCESS);
}
sau đó in nó ra
w 134520852
x 134520856
y 134520860
z 134520864
Chúng ta có thể thấy rằng khi số nguyên kia được khai báo và phân bổ, địa chỉ sẽ được di chuyển bốn vị trí (tôi đoán là byte, có vẻ logic). Nhưng nếu chúng ta không gán biến, như trong đoạn mã tiếp theo:
int w;
int x;
int y;
int z;
int main(int argc, char** argv) {
printf("\nw %d",&w);
printf("\nx %d",&x);
printf("\ny %d",&y);
printf("\nz %d",&z);
trả về (EXIT_SUCCESS);
}
nó in cái này
w 134520868
x 134520864
y 134520872
z 134520860
Chúng ta có thể thấy rằng có bốn vị trí giữa các địa chỉ, nhưng chúng không theo thứ tự. Tại sao lại thế này? Trình biên dịch hoạt động như thế nào trong trường hợp này?
Nếu bạn thắc mắc tại sao tôi lại hỏi câu hỏi này thì đó là vì tôi đã bắt đầu nghiên cứu về một số vấn đề bảo mật và tôi đang cố gắng tìm hiểu một số cuộc tấn công, như cách thức hoạt động của các cuộc tấn công tràn số nguyên và tôi đã sử dụng con trỏ trong C để sửa đổi các cuộc tấn công khác. Biến bằng cách thêm nhiều vị trí hơn kích thước của biến, v.v.
Ví dụ đầu tiên của bạn khởi tạo một biến, biến này tạo ra mã phân bổ khác. Bằng cách xem tập tin lắp ráp được tạo bởi gcc (gas), tôi nhận được:
.globl_w
.data
.căn chỉnh 4
_w:
.dài 1
.globl_x
.căn chỉnh 4
_x:
.dài 1
.globl_y
.căn chỉnh 4
_y:
.dài 1
.globl_z
.căn chỉnh 4
_z:
.dài 1
Điều này về cơ bản xác định địa chỉ bộ nhớ.
Ví dụ thứ hai của bạn tạo các biến chưa được khởi tạo, như Jonathan đã nói, đi vào BSS. .Mã lắp ráp là:
.comm_w, 4, 2
.comm_x, 4, 2
.comm_y, 4, 2
.comm_z, 4, 2
Điều này có nghĩa là bạn không thể đảm bảo thứ tự của các biến này trong bộ nhớ.
Tôi là một lập trình viên xuất sắc, rất giỏi!