访问冲突写入位置0x00D00000

时间:2017-06-14 13:08:01

标签: c

我正在尝试编写这个简单的程序,它在一个scanf函数中读取多个变量但输入输入后会抛出异常?

编辑:我最初使用了scanf,但是它会导致错误,说它可能不安全。

抛出异常:

Program.exe中的0x52DAB87C(ucrtbased.dll)抛出异常:0xC0000005:访问冲突写入位置0x00D00000

#include <stdio.h>
#include <stdlib.h>


void main()
{
    char name[20];
    int age;
    char gender;
    float income;

    printf("Enter <name> <age> <gender> <income> :");
    scanf_s("%s %d %c %f", &name, &age, &gender, &income);

    printf("Name   : %s", name);
    printf("Age    : %d", age);
    printf("Gender : %c", gender);
    printf("Income : %.2f", income);

    system("pause");
}

1 个答案:

答案 0 :(得分:6)

%s / scanf的{​​{1}}格式说明符需要指向char数组的第一个元素的指针,即scanf_s。相反,您传入的是数组的地址,在本例中为char *。这些类型是不兼容的。为格式说明符传递错误的类型会调用https://jsfiddle.net/f79vj0s3/

传递char (*)[20]而不是传入&name。传递给函数时,数组会衰减到指向第一个元素的指针,因此这是正确的类型。

name

另请注意给定的长度说明符,它限制了可以读取的字符数,因此它不会尝试写入数组的末尾。

相关问题