AI.exe中0x00007FFB158DA726 (ucrtbase.dll)的未处理异常:0xC0000005:访问



当我运行这里的代码发生后scanf("%[^n]", order);完整代码:

#define _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_DEPRECATE  
#define _CRT_NONSTDC_NO_DEPRECATE
#include <stdio.h>
#include <Windows.h>
#include "Colors.h"
#include <string>
#include "Functions.h"
#include <stdbool.h>
using namespace std;
int main() {
//vars
char* order = "";
int WinH;
int WinW;
bool error = false;
GetDesktopResolution(WinH, WinW);
// end vars
//funcs
//DelayedStart();
//end funcs
Sleep(1500);
system("CLS");
Sleep(250);
SetConsoleTitle(L"AI APP   -   Main");
printf("Hello,nHow can I help youn>>");
F_GREEN;
scanf("%[^n]", order); //error here
F_B_Defalt;

if (order == "open youtube") {
ShellExecute(0, 0, L"http://www.youtube.com", 0, 0, SW_SHOW);
}
else
{
printf("%sn", order);
puts("Whoops");
}
system("PAUSE");
}

Visual Studio 2022 V17.4

您正在扫描到字符串文字(""),这会引发未定义的行为!

实际上你应该得到一个编译器警告,因为分配这个字符串字面值,它的类型是char const/*!!!*/ *,给一个变量char /*non-const!*/ *。一些编译器允许这样做是为了与c兼容。其中一些(例如GCC)允许将此警告增强为编译错误,不确定MSVC是否也这样做,但如果这样做,您应该这样做!

另外,这个字符串字面量只包含一个字符的空间,所以(如果可能的…)你只能读一个空字符串(包含终止的null字符),否则你会再次引发未定义的行为,因为写超出数组边界。

这两种未定义行为中的任何一种都可能引起分割错误。

修复提供足够长的可写字符缓冲区来保存预期的输入:

char order[128];
// ...
scanf("%127[^n]", order);

请注意,在上面的格式字符串中是如何指定读取字符的最大长度的,但是,这个长度需要比缓冲区大小小1,因为扫描操作仍然会附加结束的空字符。

还请注意,order如何隐式地衰变为指向其第一个元素的指针,因此您不需要获取的地址-实际上这甚至是错误的,并且为格式说明符提供不匹配的指针类型(char(*)[128]char*)(即使地址相同)会引发未定义的行为。

相关内容

最新更新