C realpath函数不适用于在源文件中定义的string

我有一个奇怪的问题与realpath函数。 该函数在接收到作为程序参数的string时工作,但在给定我在源代码中定义的string时失败。 这是一个简单的程序:

 #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); } } 

当我运行这个参数~/Desktop/filefile存在,是一个普通的文件),我得到了预期的输出

 /home/<username>/Desktop/file 

这是另一个版本的程序:

 #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); } } 

当我运行这个程序时,我得到了输出

 Failed 

为什么第二个失败?

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

在你的程序中代字符 (即: ~ )不会被扩展 (ei:用你的主目录的路径代替)。

当您在命令行中提供它作为第一个程序中的参数时,它将由shell进行扩展

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

当硬编码时,它显然不是自动扩展你的名字。