【问题标题】:Access violation writing location 0x00D00000访问冲突写入位置 0x00D00000
【发布时间】:2017-06-14 13:08:01
【问题描述】:

我正在尝试编写这个简单的程序,它在一个 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");
}

【问题讨论】:

  • 为什么要用C++标签?
  • 不确定它是否修复:&amp;name => name
  • scanf_s("%s %d %c %f", &amp;name, &amp;age, &amp;gender, &amp;income); --> scanf_s("%19s %d %c %f", name, 20, &amp;age, &amp;gender, 1, &amp;income);
  • 我感觉到另一个(几乎)正确的 scanf 代码被用户破解,以响应虚假的编译器消息,建议将 scanf 更改为 scanf_s
  • 提示:文本的屏幕截图往往会吸引反对票。文本更易于搜索、剪切和粘贴。

标签: c


【解决方案1】:

%s 格式说明符到 scanf/scanf_s 需要一个指向 char 数组的第一个元素的指针,即 char *。相反,您传递的是数组的地址,在本例中为char (*)[20]。这些类型是不兼容的。为格式说明符传递错误的类型会调用undefined behavior

不要传入&amp;name,而是传入name。当传递给函数时,数组衰减为指向第一个元素的指针,因此这是正确的类型。

scanf_s("%19s %d %c %f", name, sizeof(name), &age, &gender, sizeof(gender), &income);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-15
    • 2020-09-04
    • 2012-12-05
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多