C realpath函数不';不适用于源文件中定义的字符串

C realpath函数不';不适用于源文件中定义的字符串,c,linux,realpath,C,Linux,Realpath,我对realpath函数有一个奇怪的问题。该函数在给定作为程序参数接收的字符串时工作,但在给定我在源代码中定义的字符串时失败。下面是一个简单的程序: #include <stdlib.h> #include <limits.h> #include <stdio.h> int main(int argc, const char* argv[]) { char* fullpath = (char*)malloc(PATH_MAX); if(rea

我对
realpath
函数有一个奇怪的问题。该函数在给定作为程序参数接收的字符串时工作,但在给定我在源代码中定义的字符串时失败。下面是一个简单的程序:

#include <stdlib.h>
#include <limits.h>
#include <stdio.h>

int main(int argc, const char* argv[])
{
    char* fullpath = (char*)malloc(PATH_MAX);
    if(realpath(argv[1], fullpath) == NULL)
    {
        printf("Failed\n");
    }
    else
    {
        printf("%s\n", fullpath);
    }
}
以下是该程序的另一个版本:

#include <stdlib.h>
#include <limits.h>
#include <stdio.h>

int main(int argc, const char* argv[])
{

    const char* path = "~/Desktop/file";

    char* fullpath = (char*)malloc(PATH_MAX);
    if(realpath(path, fullpath) == NULL)
    {
        printf("Failed\n");
    }
    else
    {
        printf("%s\n", fullpath);
    }
}
为什么第二个失败了

const char* path = "~/Desktop/file";
程序中的波浪号字符(即:
~
)未展开(即:替换为主目录的路径)


当您在命令行中像在第一个程序中一样将其作为参数提供时,它将被shell扩展

在运行程序之前,shell将~扩展为正确的名称,这就是argv[1]中的内容


当硬编码时,它显然不是为您自动扩展名称。

与您的问题无关,但您为什么动态分配
fullpath
?为什么不使用数组?至于您的问题,您是否尝试打印出
argv[1]
以查看它是什么?并在呼叫失败时检查
errno
?我也建议你阅读。
Failed
const char* path = "~/Desktop/file";