访问冲突写入位置0x00000000。从键盘读取int

时间:2010-01-29 19:23:01

标签: c

我正在尝试从键盘读取输入,我将用它来创建一组乘法。如果我硬编码要使用的整数,那么程序工作正常但是当我让用户输入他们自己的号码时程序崩溃并显示有关访问冲突的错误。

我确信这很简单,但因为我对C很新,所以我不完全确定使用该语言时要遵循的所有原则。

#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.");
}

注意:我将multip的初始值设置为0,否则在尝试使用未初始化的值时会遇到错误。

5 个答案:

答案 0 :(得分:18)

scanf("%d", multiple);

应该是:

scanf("%d", & multiple);

换句话说,你需要给scanf一个指向想要读入的东西的指针。这是使用scanf()的一个经典错误,并且每个人都会不时地做出这样的错误,所以请记住下次制作它: - )

答案 1 :(得分:16)

只是为了解释为什么发生这种情况(因为Neil已经解释了导致它的原因),scanf期待一个地址写入。当您传入'multiple'的时,它被解释为一个地址,特别是地址0,因为那是当时的值。

这样做的原因是scanf可以将变量的值设置为输入值。如果未传递指针,则传递变量值的副本。当您传递指针时,您传递的是指针的值的副本,因此只要scanf写入相同的内存地址,它就可以更改变量的值。

答案 2 :(得分:6)

更改

scanf("%d", multiple);

scanf("%d", &multiple);

答案 3 :(得分:6)

scanf期望指向要设置的变量的指针。

正确的表格是

scanf("%d", &multiple);

答案 4 :(得分:4)

您没有传递多个变量的地址来存储scanf的结果,因此需要scanf("%d", &multiple);

这告诉运行时,要读取整数并将其放入 address-of 变量,因此必须使用&。没有它,您在传递变量值时会遇到运行时错误,但运行时不知道如何处理它。

在坚果壳中,地址 - 变量由&表示。

希望这有帮助, 最好的祝福, 汤姆。