访问冲突写入位置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);
还要注意给定的长度说明符,它限制了可以读入的字符数,因此它不会尝试写入数组的末尾。