cuốn sách gpt4 ai đã làm

biến c cấp phát bộ nhớ, con trỏ

In lại Tác giả: Vũ trụ không gian 更新时间:2023-11-04 07:20:12 29 4
mua khóa gpt4 Nike

变量在内存中是如何定位的?我有这个代码

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.

câu trả lời hay nhất

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ớ.

Về việc cấp phát bộ nhớ và con trỏ cho các biến c, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/22028370/

29 4 0
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress