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

Truyền con trỏ tới hàm khiến việc đọc từ địa chỉ không thể truy cập được trong C

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

Tôi có một chương trình sử dụng malloc để phân bổ động bộ nhớ; đây là phần quan trọng:

unsigned int *hours;
int không dấu * phút;
giờ = (unsigned int *) malloc(n * sizeof(*hours));
phút = (unsigned int *) malloc(n * sizeof(* Minutes));

Sau đó, tôi có một vòng lặp for lặp lại n lần; mỗi lần nó đọc thời gian và lưu giờ theo giờ[i] và số phút theo phút[i]; vì (i = 0; i < n; i++)

Tôi đọc n trước khi gán:

scanf(%d, &n);

Tiếp theo, tôi có một hàm có 3 tham số và nó trông như thế này:

void ConvertToMinutes(unsigned int *hours[],unsigned int * Minutes[],int n)
{
unsigned int i;
vì (i = 0; i < n; i++)
{
*phút[i] =*giờ[i]*60 + *phút[i];
}
}

Đây là phần khiến chương trình bị lỗi. Tôi đang sử dụng Dr. Memory để xem điều gì sẽ xảy ra, đây là kết xuất:

Lỗi #1: TRUY CẬP KHÔNG THỂ ĐỊA CHỈ: đọc 0x00000005-0x00000009 4 byte
# 0 chuyển đổiToMinutes
số 1 ​​chính
Lưu ý: @0:00:11.408 trong luồng 1740
Lưu ý: hướng dẫn: mov (%eax) -> %ecx

Như bạn có thể thấy, nó cố đọc địa chỉ 0x00000005, điều này khiến Windows tắt nó.

Vì vậy, trước khi gọi hàm này, tôi đã xem địa chỉ của mảng giờ và phút và đây là những gì tôi tìm thấy:

với n = 3
giờ cơ sở 10948584
giờ+1 10948588
giờ+2 19848592
phút cơ sở 10948608
phút+1 10948612
phút+2 10948616

(địa chỉ được chuyển đổi thành int)

Tôi bị lạc. Tôi không biết có chuyện gì vậy. Con trỏ còn mới đối với tôi (tôi đã sử dụng chúng được vài ngày) và tôi không biết tại sao nó đột nhiên cố đọc ở một địa chỉ bị cấm. Tôi đã làm gì sai?

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

Chữ ký hàm này nhận một tham số trỏ đến một số nguyên không dấucon trỏmảng

void ConvertToMinutes(unsigned int *hours[],unsigned int * Minutes[],int n)

Nhưng mảng của bạn là int không dấu còn hơn là int không dấu * mảng. Hãy thử thay đổi nó thành

 void ConvertToMinutes(unsigned int Hours[],unsigned int Minutes[],int n)

Hoặc (vì dù sao đối số mảng cũng phân rã thành con trỏ)

void ConvertToMinutes(unsigned int* giờ, unsigned int* phút, int n)

Bên trong hàm loại bỏ tham chiếu và thay đổi nó thành:

 vì (i = 0; i < n; i++)
{
phút[i] = giờ[i]*60 + phút[i];
}

Về c - việc truyền con trỏ tới hàm khiến việc đọc từ địa chỉ không thể truy cập được trong 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/13208439/

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