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

c – Tại sao có nhiều công trình kiến ​​trúc như vậy?

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-04 07:10:20 hai mươi bốn 4
mua khóa gpt4 Nike

Tôi là người mới bắt đầu và tôi không hiểu tại sao mã này không bị lỗi. Tại sao lại có nhiều mặt phẳng [i] như vậy khi tôi sử dụng malloc(1) để phân bổ các mặt phẳng?

int main()
{

cấu trúc typedef Chuyến bay2{
độ cao int;
int kinh độ;
int vĩ độ;

}Chuyến bay;

Chuyến bay *máy bay;
máy bay = (Chuyến bay*)malloc(1);
if (máy bay == NULL) {
printf("Lỗi khi cấp phát mảng dữ liệu.\n");

}
printf("%d.\n",sizeof(Chuyến bay));
mặt phẳng[0].altitude = 1000;
mặt phẳng[100].altitude = 1200;
printf("0: %d\n",planes[0].altitude);
máy bay miễn phí((void*));
printf("100: %d",planes[100].altitude);
return 0;
}

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

Đầu tiên, bạn đang truy cập máy bay Vị trí đầu tiên của mảng có hành vi không xác định. Từ thời điểm đó trở đi, bất cứ điều gì cũng có thể xảy ra. Tuy nhiên, tình huống của bạn được giải thích ở đâyThực rachuyện gì đã xảy ra thế. Đừng bao giờ tin vào những gì tôi nói ở đây, nhưng việc biết những gì diễn ra đằng sau sẽ mang tính hướng dẫn.

Cấu trúc của bạn có kích thước 12 byte (ít nhất là trên hệ thống của tôi). Vì vậy, 100 Chuyến bay Đối tượng yêu cầu 1200 byte bộ nhớ. Điều này quan trọng vì hệ thống quản lý bộ nhớ của tiến trình theo các trang bộ nhớ, có dung lượng 4096 byte trên phần cứng X86. Vì vậy, điều gì sẽ xảy ra:

  1. bạn đến từ malloc() Yêu cầu một byte.

  2. malloc() Quá trình triển khai chưa có phân bổ bộ nhớ nên nó yêu cầu bộ nhớ từ nhân hệ thống.

  3. Nhân hệ thống cung cấp ít nhất một trang đầy đủ đểmalloc()hoàn thành.

  4. malloc() Việc triển khai ghi một số dữ liệu riêng tư vào một trang bộ nhớ để dữ liệu đó có thể được trả về cho bạn thành nhiều phần nhỏ.

  5. malloc() Việc triển khai trả về một con trỏ trong trang. Điều này rất có thể trỏ đến một địa chỉ cao hơn nơi nó lưu trữ dữ liệu riêng tư của chính nó. Nhưng nó phụ thuộc malloc() sự thực hiện.

  6. Bạn ghi vào bộ nhớ bắt đầu từ con trỏ này ở các offset từ 0 đến 3 và 1188-1191.

    Điều này không thất bại vì nó vẫn nằm trong trang bộ nhớ, vì vậy phần cứng và nhân hệ thống cho rằng quyền truy cập này là ổn. nó là (chỉ) malloc() định nghĩa của xung đột với những gì bạn đang làm.

  7. Bởi vì bạn đã không phá hủy malloc() Bất kỳ dữ liệu riêng tư quan trọng nào của việc thực hiện, vì vậy miễn phí() Cuộc gọi được mở mà không nhận ra rằng có điều gì đó đáng ngờ đã xảy ra và chương trình của bạn sẽ kết thúc một cách nhẹ nhàng.

Lưu ý rằng hoạt động có vẻ thành công của chương trình của bạn phụ thuộc vào thực tế là chỉ có một sự phân bổ trong đó. Nếu bạn chèn cái thứ hai sau cuộc gọi đầu tiên malloc() gọi cho bạnkhả thiSự cố xảy ra vì bạnkhả thiGhi đè dữ liệu riêng tư của bạnmalloc() hoàn thành. Điều này có thể dẫn đến miễn phí() Hủy bỏ chương trình của bạn với một thông báo lỗi, gây ra lỗi khác malloc() Gọi hành vi sai, làm hỏng chương trình của bạn theo bất kỳ cách nào hoặc làm bất cứ điều gì khác. Nếu bạn chèn cái thứ hai trước cuộc gọi đầu tiên malloc() gọi, bạn có thể khiến việc phân bổ xảy ra ở cuối trang bộ nhớ, điều nàykhả thisẽ cung cấp cho bạn một segfault. Nhưng một khi bạn bước vào lĩnh vực hành vi không xác định thì không có gì là chắc chắn cả.

BTW: nếu bạn sử dụng valgrind Chạy chương trình của bạn và nó sẽ cho bạn biết chính xác điều gì đã xảy ra và lỗi như thế nào. Đây thực sự là một công cụ tuyệt vời mà bạn nên làm quen.

Về c - tại sao có nhiều cấu trúc như vậy? , 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/28930794/

hai mươi bốn 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