通过指针比较char数组有一些问题。我在没有字符串库和iostream的情况下工作,希望保持这种方式。
char *GetCurrentPath()
{
char buffer[MAX_PATH];
if (!GetModuleFileNameA(NULL, buffer, MAX_PATH)) {
printf("GetModuleFileNameA failed, error: %d\n", GetLastError());
}
return (buffer);
}
char *GetInstallPath()
{
char buffer[MAX_PATH];
if (!SHGetSpecialFolderPathA(NULL, buffer, CSIDL_APPDATA, FALSE)) {
printf("SHGetSpecialFolderPathA failed, error: %d\n", GetLastError());
}
strcat(buffer, "\\service.exe");
return (buffer);
}
char *InstallPath = GetInstallPath();
char *CurrentPath = GetCurrentPath();
if (InstallPath == CurrentPath)......
if语句导致即时崩溃,strcomp也是如此。
连连呢?
答案 0 :(得分:2)
您目前正在做的是未定义的行为。您在两个函数中使用的缓冲区在本地定义为这些函数,并在函数结束时超出范围,为您提供指向随机堆栈地址的指针。
您需要在函数中分配缓冲区:
替换:char buffer[MAX_PATH];
使用:char *buffer = new char[MAX_PATH]
或者将已分配的缓冲区从main传递给函数:
char *InstallPath = new char[MAX_PATH];
GetInstallPath(InstallPath);
并更改获取路径功能:
char *GetInstallPath(char *buffer)
在这两种情况下,您必须在结束程序之前删除指针以释放内存。
最重要的是,当您尝试比较两个变量时,它们将比较指针地址而不是字符串内容。您需要在该系列函数中使用strcmp()
或其他内容。
答案 1 :(得分:0)
您的函数返回在其中本地声明的数组(char *)。您的指针在函数外部具有未定义的值。你不能这样做。
您可以动态分配它们:
char *buffer = malloc(MAX_PATH*sizeof(char));
答案 2 :(得分:0)
由于两个缓冲区都在堆栈上分配,因此在函数执行结束后释放它们。因此,指针函数返回变为无效。
要解决这个问题,你必须在堆上分配buffer [],使用char * buffer = new char [MAX_PATH];
但是你必须手动释放内存。