2012-05-07 31 views
12

Tôi gặp vấn đề rất lạ với trò chơi xâm lược không gian tôi đang nghiên cứu. Về cơ bản tôi nhận được lỗi vi phạm quyền truy cập:0xC0000005: Truy cập vi phạm vị trí đọc 0x00000000

Unhandled exception at 0x5edad442 (msvcr100d.dll) in SpaceInvaders.exe: 0xC0000005: Access violation reading location 0x00000000.

khi tôi bao gồm đoạn mã bên dưới. visual studio đưa tôi đến "strcmp.asm" khi gỡ lỗi. Lưu ý rằng Im không sử dụng strcmp() trong bất kỳ mã nào của tôi. Có điều gì sai với mã, hay đây có phải là vấn đề nằm ngoài phạm vi của những gì tôi đã đưa vào không? Nhờ sự giúp đỡ

const char* invarray[] = {"invader0.png", "invader1.png", "invader2.png", "invader3.png", "invader4.png"}; 
int i=0; 
//Creates 55 invaders 
for (int y=0; y<250; y+=50){ 
    for (int x=0; x<550;x+=50){ 
     Invader inv(invarray[y/50], x+50, y+550, 15, 15, 1, false, 250); 
     invaders[i] = inv; 
    } 
} 

Invader constructor:

Invader::Invader(const char *pic, int x, int y, int w, int h, bool dir, bool des, int point) : MovingObject(pic, x, y, w, h) , direction(dir), destroyed(des), b(0), points(point){}; 

MovingObject Constructor

MovingObject::MovingObject(const char *pic, int x, int y, int w, int h):picture(pic), positionX(x), positionY(y), width(w), height(h) {}; 
+1

Hiển thị mã bên trong hàm tạo của Invader –

+1

Thông báo lỗi gợi ý rằng đây là một tham số con trỏ rỗng, nhưng tôi không thể thấy điều này sẽ xảy ra ở đâu trong mã của bạn. Ngoài constructor Invader, vui lòng chỉ cho chúng ta biết nơi/cách mà mảng invaders được khởi tạo. Các nhà xây dựng bản sao của Invader có thể là thú vị là tốt, nếu nó có một. – Medo42

+0

Tôi vừa cập nhật OP với các nhà thầ[email protected], mảng xâm lược vừa được khởi tạo dưới dạng biến toàn cầu: "Invader Invaders [55];" – Milk

Trả lời

10

Dòng này có vẻ khả nghi:

invaders[i] = inv; 

Bạn sẽ không bao giờ incrementing i, vì vậy bạn cứ gán cho invaders[0]. Nếu đây chỉ là lỗi bạn đã thực hiện khi giảm mã của mình xuống ví dụ, hãy kiểm tra cách bạn tính i trong mã thực; bạn có thể vượt quá kích thước của invaders.

Nếu như nhận xét của bạn gợi ý, bạn đang tạo 55 invaders, sau đó kiểm tra xem invaders đã được khởi tạo đúng cách để xử lý số này chưa.

+0

cảm ơn rất nhiều, đó là: s – Milk

22

"Tiếp cận vi phạm đọc vị trí 0x00000000" có nghĩa là bạn đang derefrencing a pointer mà chưa được khởi tạo và do đó có giá trị rác. Những giá trị rác có thể là bất cứ điều gì, nhưng thường nó xảy ra là 0 và do đó bạn cố gắng đọc từ địa chỉ bộ nhớ 0x0, hệ điều hành phát hiện và ngăn bạn làm.

Kiểm tra và đảm bảo rằng mảng invaders[] là những gì bạn nghĩ.

Ngoài ra, bạn dường như không được cập nhật i bao giờ - có nghĩa là bạn tiếp tục đặt cùng một đối tượng Invader vào vị trí 0 của invaders[] tại mỗi lần lặp.

0

Vấn đề ở đây, như được giải thích trong các nhận xét khác, là con trỏ đang được coi là không cần thiết mà không được khởi tạo đúng cách. Các hệ điều hành như Linux giữ các địa chỉ thấp nhất (ví dụ 32MB đầu tiên: 0x00_0000 -0x200_0000) ra khỏi không gian địa chỉ ảo của một tiến trình. Điều này được thực hiện vì dereferencing zeroed non-initialized con trỏ là một sai lầm phổ biến, như trong trường hợp này. Vì vậy, khi loại lỗi này xảy ra, thay vì thực sự đọc một biến ngẫu nhiên xảy ra tại địa chỉ 0x0 (nhưng không phải địa chỉ bộ nhớ con trỏ sẽ được dự định nếu được khởi tạo đúng), con trỏ sẽ đọc từ địa chỉ bộ nhớ bên ngoài không gian địa chỉ ảo của quy trình. Điều này gây ra lỗi trang, dẫn đến lỗi phân đoạn và tín hiệu được gửi đến quy trình để xóa nó. Đó là lý do bạn nhận được lỗi vi phạm quyền truy cập.

Các vấn đề liên quan