访问冲突写入位置0x00D00000

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

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

抛出exception:

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

#include  #include  void main() { char name[20]; int age; char gender; float income; printf("Enter     :"); 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"); } 

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

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

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

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