比较C / C ++中的指针(char数组)

时间:2017-01-26 23:16:16

标签: c arrays pointers char

通过指针比较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也是如此。

连连呢?

3 个答案:

答案 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];

但是你必须手动释放内存。