0x7BA4EF8C (ucrtbased.dll)处(位于 Project1.exe 中)引发的异常: 0xC0000005: 写入位置 0x00540000 时发生访问冲突。
在VS2019版中写了一个很简单的冒泡算法,结果出现错误:
0x7BA4EF8C (ucrtbased.dll)处(位于 Project1.exe 中)引发的异常: 0xC0000005: 写入位置 0x00540000 时发生访问冲突。
#include<stdio.h>
struct student
{
char name[20];
int score;
};
int main()
{
int i, j, n;
struct student a[100], t;
scanf_s("%d", &n);
for (i = 1;i <= n;i++)
{
scanf_s("%s %d", &a[i].name, &a[i].score);
}
//排序
for (i = 1;i <= n - 1;i++)
{
for (j = 1;j <= n - i;j++)
{
if (a[j].score < a[j + 1].score)
{
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
for (i = 1;i <= n;i++)
{
printf("%s\n", a[i].name);
}
return 0;
}
这是因为在使用VS2019时,编译器选择用scanf_s,代替scanf。而二者的定义并不一样。往往习惯于scanf的使用规则,所以在写入字符串或者数组的时候就会被坑。如上述所示,编译器不会报错,但是在进入第二次循环后,调试过程会出现异常。原因是:scanf_s在使用数组指针作为写入变量地址参数时,还需要加一个buffer长度参数,更安全。改正如下所示:
#include<stdio.h>
struct student
{
char name[20];
int score;
};
int main()
{
int i, j, n;
struct student a[100], t;
scanf_s("%d", &n);
for (i = 1;i <= n;i++)
{
scanf_s("%s %d", &a[i].name,20,&a[i].score);
}
//排序
for (i = 1;i <= n - 1;i++)
{
for (j = 1;j <= n - i;j++)
{
if (a[j].score < a[j + 1].score)
{
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
for (i = 1;i <= n;i++)
{
printf("%s\n", a[i].name);
}
return 0;
}