2010-01-29 22 views
11

Tôi đang cố đọc đầu vào từ bàn phím mà tôi sẽ sử dụng để tạo một tập hợp các phép nhân. Nếu tôi hardcode số nguyên để sử dụng thì chương trình hoạt động tốt tuy nhiên khi tôi cho phép người dùng nhập số riêng của họ chương trình bị treo và hiển thị một lỗi về một sự vi phạm truy cập.Vi phạm truy cập bằng văn bản vị trí 0x00000000. đọc int từ bàn phím

Tôi chắc chắn đây là điều đơn giản nhưng vì tôi khá mới đối với C tôi không hoàn toàn chắc chắn về tất cả các nguyên tắc cần tuân thủ khi sử dụng ngôn ngữ.

#include <stdio.h> 
#include <string.h> 
#include <math.h> 

void main() 
{ 
    int multiple = 0; 
    int i; 
    int answer; 

    printf("Enter the multiple you wish to use..."); 
    scanf("%d", multiple); 

    printf("The multiplication table for %d is", multiple); 

    for(i = 1; i <= 10; i++) 
    { 
     answer = i * multiple; 

     printf("%d X %d = %d",i,multiple,answer); 
     printf("\n"); 
    } 

    printf("Process completed."); 
} 

Lưu ý: Tôi đặt giá trị ban đầu của bội số thành 0 nếu không tôi gặp phải lỗi khi cố sử dụng giá trị chưa được khởi tạo.

+1

Câu hỏi C sớm hay. +1. –

+0

+1 từ tôi vì đó là một trở ngại ban đầu khi sử dụng scanf khi học C. – t0mm13b

Trả lời

18
scanf("%d", multiple); 

nên là:

scanf("%d", & multiple); 

Nói cách khác, bạn cần phải cung cấp cho scanf một con trỏ đến điều bạn muốn đọc vào. Đây là một sai lầm kinh điển trong việc sử dụng scanf(), và là một trong tất cả mọi người làm bất cứ lúc nào, vì vậy hãy nhớ điều này cho lần sau bạn làm cho nó :-)

+0

Tuyệt vời, cảm ơn. –

6

Thay đổi

scanf("%d", multiple); 

để

scanf("%d", &multiple); 
6

scanf mong muốn một con trỏ đến biến được đặt.

Hình thức đúng là

scanf("%d", &multiple); 
16

Chỉ cần giải thích lý do tại sao này xảy ra (như Neil đã giải thích những gì đã gây ra nó), scanf đã mong một địa chỉ để ghi vào. Khi bạn vượt qua trong giá trị của 'nhiều', nó được hiểu là địa chỉ, cụ thể là địa chỉ 0 vì đó là giá trị tại thời điểm đó.

Lý do cho điều này là để scanf có thể đặt giá trị của biến của bạn thành giá trị của đầu vào. Nếu bạn không vượt qua một con trỏ bạn đang đi qua một bản sao của giá trị của biến. Khi bạn vượt qua một con trỏ, bạn đang truyền một bản sao giá trị của con trỏ , miễn là scanf ghi vào cùng một địa chỉ bộ nhớ đó, nó có thể thay đổi giá trị của biến đó.

+0

Cảm ơn bạn đã giải thích, tôi đã upvoted câu trả lời của bạn. –

4

Bạn không chuyển địa chỉ biến cho nhiều để lưu trữ kết quả từ scanf do đó yêu cầu cho scanf("%d", &multiple);.

Điều này cho biết thời gian chạy, để đọc số nguyên và đặt số đó vào địa chỉ -của biến số, do đó phải sử dụng &. Không có nó, bạn có một lỗi thời gian chạy khi bạn đang truyền giá trị của biến nhưng thời gian chạy không biết phải làm gì với nó.

Trong vỏ hạt, địa chỉ -của biến được biểu thị bằng &.

Hy vọng điều này sẽ giúp, Trân trọng, Tom.

+0

Cảm ơn bạn đã giải thích chi tiết, tôi đã bình chọn câu trả lời của bạn –

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